web-dev-qa-db-ja.com

OpenSSLライブラリをプログラムにリンクする

私はソースから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を間違ってコンパイルしていますか?または、これをどのように解決するのが最善ですか?

18
mrduclaw

ばかげた "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

26
mrduclaw

make installを使用したくないのはなぜですか。以前に./configure --prefix $HOME/target_library_install_directoryに渡した場合は、必要なディレクトリに生成されたバイナリをコピーできます。

ビルドおよびインストールするすべてのライブラリでこのトリックを使用した場合、ターゲットディレクトリをLIBRARY_PATH環境変数に追加し、-Lオプションの使用を回避できます。

5
jopasserat

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を使用してライブラリを静的にリンクする方法 も参照してください。

3
jww