2

うまくいかないと思っていましたが、プログラム ファイルをローカル マシンから Amazon EC2 の新しいインスタンスにアップロードしました。それを実行しようとしたよりも:

[ec2-user@domU-12-31-39-14-2A-1A ~]$ ./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 インスタンスを対象とするローカル マシンでコンパイル/リンクするにはどうすればよいですか。インスタンス上に構築したくありません。

私のメイクファイル

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 
4

2 に答える 2

2

醜いが簡単な解決策は、プログラムを静的にリンクすることです。

より精巧な解決策は、EC2 インスタンスの環境を、たとえばchrootローカル マシンの -ed 環境で模倣することです。

その間に、EC2 の /usr/include と /usr/lib/libc.so などをローカルにコピーすることもできますが、これは危険です。

おそらく、ローカルでコンパイルして EC2 にリンクすることもできます... (しかし、それはうまくいかないかもしれません)

于 2011-11-06T20:05:47.570 に答える
1

動的ライブラリlib*.soは、他の動的ライブラリに依存して構築できます。(たとえば、マシン上の他のシステムライブラリでldd /usr/lib/libgtk-3.soまたはを試してください)。ldd*.so

静的ライブラリlib*.aは基本的にオブジェクト ファイルの組み合わせにすぎず、*.oその依存関係はわかりません。

したがって、静的にリンクする場合は、すべてのライブラリを正しい順序でリンクする必要があります。

于 2011-11-07T13:55:16.477 に答える