Подтвердить что ты не робот

Связывание библиотек 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 неправильно? Или как мне лучше всего это решить?

4b9b3361

Ответ 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 для связывания библиотеки статически.