私はソースからOpenSSLをビルドしました(意図的に古いバージョンです。./config && make && make test
)そして、私が構築したものを使用せずにmake install
自分のプログラムにリンクします。
失敗しているコマンドは次のとおりです。
gcc -Wall -Wextra -Werror -static -Lopenssl/openssl-0.9.8k/ -lssl -lcrypto
-Iopenssl/openssl-0.9.8k/include -o myApp source1.o source2.o common.o`
そして、私は次のような一連のエラーを受け取ります:
common.c:(.text+0x1ea): undefined reference to `SSL_write'
これにより、私のOpenSSLには何かファンキーなものがあると思います。省略した場合-Lopenssl/openssl-0.9.8k/
私のコマンドから、エラーは次のことができないように変わります:
/usr/bin/ld: cannot find -lssl
/usr/bin/ld: cannot find -lcrypto
OpenSSLを間違ってコンパイルしていますか?または、これをどのように解決するのが最善ですか?
ばかげた "Linux-isms"が再びストライキ!どうやら、コマンドを-L
および-l
ものは最後にのように(何であれman gcc
が示すようです):
gcc -Wall -Wextra -Werror -static -o myApp source1.o source2.o common.o -Lopenssl/openssl-0.9.8k/ -lssl -lcrypto -Iopenssl/openssl-0.9.8k/include
make install
を使用したくないのはなぜですか。以前に./configure --prefix $HOME/target_library_install_directory
に渡した場合は、必要なディレクトリに生成されたバイナリをコピーできます。
ビルドおよびインストールするすべてのライブラリでこのトリックを使用した場合、ターゲットディレクトリをLIBRARY_PATH
環境変数に追加し、-Lオプションの使用を回避できます。
Autotoolsを使用している場合、またはcURL
のようなAutoolsプロジェクトをビルドしている場合は、pkg-config
を使用できるはずです。 AutotoolsパッケージがOpenSSLのパッケージ構成を読み取り、すべてが正常に機能するという考え方です。
OpenSSLパッケージ構成ライブラリの名前はopenssl
です。
Makefileベースのプロジェクトでは、このように使用します。
%.o: %.c
$(CC) -o $@ -c `pkg-config --cflags openssl` $^
target: foo.o bar.o baz.o
$(CC) -o $@ `pkg-config --libs openssl` $^
Makeでpkg-configを使用する方法 および pkg-configを使用してライブラリを静的にリンクする方法 も参照してください。