Связывание библиотек 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 неправильно? Или как мне лучше всего это решить?
Ответы
Ответ 1
Глупые "Linux-измы" снова ударяют! По-видимому, мне нужно изменить мою команду таким образом, чтобы объекты -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
Ответ 2
Почему вы не хотите использовать make install
? Он может копировать сгенерированные двоичные файлы в нужную вам директорию, если вы ранее передали ее в ./configure --prefix $HOME/target_library_install_directory
Если вы использовали этот трюк для каждой библиотеки, которую вы строили и устанавливали, вы могли бы затем добавить целевой каталог в переменную среды LIBRARY_PATH
и не использовать параметр -L.
Ответ 3
Если вы используете Autotools или вы строите проект Autools, например cURL
, вы должны использовать pkg-config
. Идея заключается в том, что пакет Autotools будет читать конфигурацию пакета OpenSSL, и все будет "просто работать" для вас.
Имя библиотеки конфигурации пакета OpenSSL openssl
.
Вы бы использовали его так в проекте на основе make файла.
%.o: %.c
$(CC) -o [email protected] -c `pkg-config --cflags openssl` $^
target: foo.o bar.o baz.o
$(CC) -o [email protected] `pkg-config --libs openssl` $^
Также см. Как использовать pkg-config в Make и Как использовать pkg-config для связывания библиотеки статически.