2011-11-06 36 views
2

我認爲它不起作用,但我只是將我的程序文件從本地計算機上傳到Amazon EC2上的新實例。比試圖運行它:您如何爲Arch Linux構建Basic 64位Amazon Linux?

[[email protected] ~]$ ./webserver.net 
-bash: ./webserver.net: /lib/ld-linux-x86-64.so.2: bad ELF interpreter: No such file or directory 

顯然沒有/lib/ld-linux-x86-64.so.2。它是一個64位的實例。

我將如何編譯/鏈接在本地計算機上定位EC2實例。我不想在實例上構建它。

我的Makefile

OBJECTS= ./obj/hello.o 
LDFLAGS = -L/usr/lib -lwt -lwthttp 

./bin/webserver.net : $(OBJECTS) 
    g++ -o ./bin/webserver.net $(OBJECTS) $(LDFLAGS) 

./obj/hello.o : ./src/hello.cpp 
    g++ -c ./src/hello.cpp -o ./obj/hello.o 

.PHONY: clean 

clean: 
    -rm -f obj/*.o bin/webserver.net core *~ src/*~ 

更新靜態鏈接文件。直到我按照正確的順序手動添加每個庫,纔有未定義的引用。這是必要的嗎?還是我做錯了?

g++ -static -pthread -o ./bin/out.net ./obj/hello.o -lwthttp -lwt -lboost_thread -lboost_system -lboost_program_options -lboost_random -lboost_signals -lboost_filesystem -lboost_regex -lboost_serialization -lboost_date_time -lssl -lcrypto -lz -ldl 

回答

2

一個醜陋但簡單的解決方案可能是靜態鏈接您的程序。

更詳細的解決方案可能是模仿EC2實例的環境。在本地機器上使用chroot環境。

您可以在兩者之間複製EC2的/ usr/include和/usr/lib/libc.so ...等,但本地存在風險。

或許也是你可以本地編譯,並在EC2鏈接...(但可能無法正常工作)

+0

只要我開始工作,它會標記爲正確。目前正在構建boost和wt靜態庫。 –

+0

工程很棒。謝謝。如果你知道答案,請在上面添加一個小方面的問題。 –

+0

我以爲你嘗試過'chroot'方法(perpahs使用和配置'schroot'包和命令)。 –

1

一個動態庫lib*.so可以與其他動態庫的依賴關係構建。 (例如,在機器上的某個其他系統*.so庫上嘗試使用ldd /usr/lib/libgtk-3.soldd)。

靜態庫lib*.a實質上只是*.o目標文件的組合,並且不知道它的依賴關係。

所以當靜態鏈接時,你需要確實鏈接所有的庫,按照正確的順序。

+0

謝謝。我的下一個問題「我可以將所有這些文件一起加入嗎?」已經在SO [這裏]回答(http://stackoverflow.com/questions/13128/how-to-combine-several-c-c-libraries-into-one) –