2016-09-27 2 views
0

Я работаю над выпуском Red Hat Enterprise Linux Server версии 7.0 (Maipo). Сервер обеспечивает OpenSSL 1.0.1. При попытке ссылки на OpenSSL я получаю много криптовых ошибок.Неопределенная ссылка на `[email protected] '(и другие)

Вот моя ссылка команда командной строки (для того, как в командной строке):

g++ -g -O2 -Wl,-rpath -o output file1.o libprivate_lib1.so -Lprivate_path -llib1 -ldl \ 
-lpthread -llib2 -lexpat -lgtest -lgtest_main -lboost_regex -lboost_filesystem -llzma \ 
-lcrypto private_lib2.so private_lib3.so -llib3 

Вот некоторые из ошибок:

/lib64/libssl.so.10: undefined reference to `[email protected]' 
/lib64/libssh2.so.1: undefined reference to `[email protected]' 
/lib64/libssl.so.10: undefined reference to `[email protected]' 
/lib64/libssl.so.10: undefined reference to `[email protected]' 
/lib64/libssl.so.10: undefined reference to `[email protected]' 
/lib64/libssl.so.10: undefined reference to `[email protected]' 
/lib64/libssl.so.10: undefined reference to `[email protected]' 
/lib64/libssh2.so.1: undefined reference to `[email protected]' 
/lib64/libssl.so.10: undefined reference to `[email protected]' 
/lib64/libssl.so.10: undefined reference to `[email protected]' 
/lib64/libssl.so.10: undefined reference to `[email protected]' 
/lib64/libssl.so.10: undefined reference to `[email protected]' 
/lib64/libssh2.so.1: undefined reference to `[email protected]' 
/lib64/libssl.so.10: undefined reference to `[email protected]' 
/lib64/libssl.so.10: undefined reference to `[email protected]' 
... 

, когда я бегу:

ll /usr/lib64/libcrypto.so 

Я получаю

/usr/lib64/libcrypto.so -> libcrypto.so.1.0.1e 

и при работе:

objdump -tT /usr/lib64/libcrypto.so.1.0.1e | grep COMP_zlib 

я

000000000013e500 g DF .text 0000000000000002 libcrypto.so.10 COMP_zlib_cleanup 
000000000013e460 g DF .text 000000000000009e libcrypto.so.10 COMP_zlib 

так это значит, что я его в этой библиотеке. Самое странное, что он может ссылаться на redhat 6.5/4, но не с redhat выше 7. любые предложения?

+0

Вопрос неясен и может быть много потенциальных причин. Мы даже не знаем, что * вы пытаетесь связать или какие версии используемых вами инструментов и как вы их используете (например, CLI args) и т. Д. – ray

+0

Возможно, вы забыли связаться с libcrypto? Добавьте флаг связывания '-lcrypto' ** после ** флаги для ссылки на libssl. Или, возможно, вы пытаетесь связать какую-то несовместимую библиотеку, которую вы скомпилировали на компьютере, который несовместим с Red Hat 7.0. Во всяком случае, это хорошая идея, чтобы подробно описать вашу проблему, например. покажите нам фактическую команду, которую вы выполнили, которая произвела этот вывод. – nos

+0

Я связываюсь с crypto lib (добавлена ​​командная строка). Я думаю, что это связано с redhat 7. потому что он умеет компилировать на redhat 6.5/4. – yehudahs

ответ

0

Функции, подобные COMP_zlib и EVP_get_cipherbyname, являются частью библиотеки OPENSSL SSL, а не библиотеки Crypto. У вас есть -lcrypto, но вы, кажется, не хватает -lssl:

g++ -g -O2 -Wl,-rpath -o output file1.o libprivate_lib1.so -Lprivate_path -llib1 -ldl \ 
-lpthread -llib2 -lexpat -lgtest -lgtest_main -lboost_regex -lboost_filesystem -llzma \ 
-lcrypto private_lib2.so private_lib3.so -llib3 

Вы должны изменить к -lssl -lcrypto:

g++ -g -O2 -Wl,-rpath -o output file1.o libprivate_lib1.so -Lprivate_path -llib1 -ldl \ 
-lpthread -llib2 -lexpat -lgtest -lgtest_main -lboost_regex -lboost_filesystem -llzma \ 
-lssl -lcrypto private_lib2.so private_lib3.so -llib3 

Еслиprivate_lib2.so private_lib3.so зависит от OpenSSL, то -lssl -lcrypto должен быть перемещен после них. То есть, используйте private_lib2.so private_lib3.so -lssl -lcrypto.

Также libssh должен продолжаться -lssl -lcrypto. Я не вижу, где его связывают, но в библиотеке может идти другое имя. В конце концов, вам может быть проще использовать список библиотек <other libs> ... -lssl -lcrypto -llzma -pthread.

Это может быть и более новая версия OpenSSL, но она настроена по-разному. Например, похоже, что Red Hat удаляет сжатие (./configure no-comp ...), но заголовки приносят символы, такие как COMP_zlib.

Я предполагаю, что ваш следующий шаг: (1) показать типичную команду компиляции и (2) предоставить g++ -v, чтобы мы могли видеть пути поиска заголовков.

Нужно иметь в виду, что вы используете g++, поэтому связь с extern "C++" по умолчанию. Это может быть один из тех старых заголовков OpenSSL не хватает обычного:

#ifdef __cplusplus 
extern "C" { 
#endif 

... 

#ifdef __cplusplus 
} 
#endif 

У меня нет доступа к серверу Red Hat, так что я не знаю точно. Я тестирую другую библиотеку, используя как CentOS, так и Fedora, но я знаю, что иногда существуют различия.

Смежные вопросы