2016-12-23 2 views
0

В настоящее время я пытаюсь создать простого поставщика IceCast, используя libshout.libshout build undefined ссылка на SSL_is_init_finished

К сожалению, я не в состоянии решить некоторые ошибки компоновщика:

Invoking: Cygwin C++ Linker 
g++ -L"D:\Programme\Cygwin\usr\x86_64-w64-mingw32\sys-root\mingw\include\ogg" -L"D:\Programme\Cygwin\usr\x86_64-w64-mingw32\sys-root\mingw\include" -L"D:\Programme\Cygwin\usr\x86_64-w64-mingw32\sys-root\mingw\include\vorbis" -o "LibshoutJavaAdapter.exe" ./src/LibshoutJavaAdapter.o -lshout -lvorbis -logg -lssl -lcrypto 
/usr/lib/gcc/x86_64-pc-cygwin/5.4.0/../../../../lib/libshout.a(tls.o): In function `tls_setup_process': 
/cygdrive/d/Programme/utility/libshout-2.4.1/src/tls.c:200: undefined reference to `SSL_is_init_finished' 
/cygdrive/d/Programme/utility/libshout-2.4.1/src/tls.c:200:(.text+0x74): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `SSL_is_init_finished' 
/cygdrive/d/Programme/utility/libshout-2.4.1/src/tls.c:203: undefined reference to `SSL_is_init_finished' 
/cygdrive/d/Programme/utility/libshout-2.4.1/src/tls.c:203:(.text+0x8f): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `SSL_is_init_finished' 
/usr/lib/gcc/x86_64-pc-cygwin/5.4.0/../../../../lib/libshout.a(tls.o): In function `tls_setup': 
/cygdrive/d/Programme/utility/libshout-2.4.1/src/tls.c:66: undefined reference to `OPENSSL_init_ssl' 
/cygdrive/d/Programme/utility/libshout-2.4.1/src/tls.c:66:(.text+0x4ad): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `OPENSSL_init_ssl' 
/cygdrive/d/Programme/utility/libshout-2.4.1/src/tls.c:67: undefined reference to `OPENSSL_init_ssl' 
/cygdrive/d/Programme/utility/libshout-2.4.1/src/tls.c:67:(.text+0x4b9): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `OPENSSL_init_ssl' 
/cygdrive/d/Programme/utility/libshout-2.4.1/src/tls.c:68: undefined reference to `SSLeay_add_all_algorithms' 
/cygdrive/d/Programme/utility/libshout-2.4.1/src/tls.c:68:(.text+0x4be): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `SSLeay_add_all_algorithms' 
/cygdrive/d/Programme/utility/libshout-2.4.1/src/tls.c:69: undefined reference to `OPENSSL_init_ssl' 
/cygdrive/d/Programme/utility/libshout-2.4.1/src/tls.c:69:(.text+0x4c7): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `OPENSSL_init_ssl' 
collect2: error: ld returned 1 exit status 

Я использую GCC 64-битную версию Cygwin в, butalso получил 32 версию для компиляции с, если это необходимо. Сборка запускается с помощью сделать

Мой реальный код до сих пор является довольно простой (я только начала работы с этой библиотекой)

#include <iostream> 
#include <shout/shout.h> 

int main() { 
    shout_init(); 
    std::cout << "!!!Hello World!!!" << std::endl; // prints !!!Hello World!!! 
    return 0; 
} 

Я использую следующие библиотеки для компоновщика в этом заказе (-l): рупор -> фактической библиотеки я пытаюсь использовать Vorbis Ogg криптографический SSL

от взгляда ошибки я полагаю, что это связано с каким-то Ssl, но я сделал включать Тхо не так ли? Я уже пытался вращающейся порядок, но только создал больше ошибок, поэтому я полагаю, что порядок правильно ...

Edit 1:

Как предложили nnovich-КИ, я изменил мой код, как это проверить OpenSSL:

#include <iostream> 
//#include <shout/shout.h> 
#include <ctype.h> 
#include <openssl/ssl.h> 

int main() { 
    //shout_init(); 
    OPENSSL_init(); 
    OPENSSL_INIT_SETTINGS * test = NULL; 
    OPENSSL_init_ssl(0,test); 
    //SSL_is_init_finished(); 
    std::cout << "!!!Hello World!!!" << std::endl; // prints !!!Hello World!!! 
    return 0; 
} 

Там в результате Увязка ошибка выглядит следующим образом:

g++ -L"D:\Programme\Cygwin\usr\x86_64-w64-mingw32\sys-root\mingw\include\ogg" -L"D:\Programme\Cygwin\usr\x86_64-w64-mingw32\sys-root\mingw\include" -L"D:\Programme\Cygwin\usr\x86_64-w64-mingw32\sys-root\mingw\include\vorbis" -o "LibshoutJavaAdapter.exe" ./src/LibshoutJavaAdapter.o -lshout -lvorbis -logg -lssl -lcrypto 
./src/LibshoutJavaAdapter.o: In function `main': 
/cygdrive/d/Install und andere Sachen/Eclipse/C++/LibshoutJavaAdapter/Debug/../src/LibshoutJavaAdapter.cpp:18: undefined reference to `OPENSSL_init_ssl' 
/cygdrive/d/Install und andere Sachen/Eclipse/C++/LibshoutJavaAdapter/Debug/../src/LibshoutJavaAdapter.cpp:18:(.text+0x27): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `OPENSSL_init_ssl' 
collect2: error: ld returned 1 exit status 

Я вижу, что есть проблема с OPENSSL_init_ssl от ssl.h, но не с OPENSSL_init от crypto.h (witch intern входит в ssl.h)

Это дает кому-то идею?

Любые намеки на решение этой проблемы оценили

+1

Системная версия Cygwin OpenSSL 1.0.2j (на момент написания данной статьи). 'SSL_is_init_finished' является частью OpenSSL 1.1.0. Я не вижу команду компиляции, указывающую, что вы используете версию 1.1.0.Как минимум, я ожидаю увидеть что-то вроде '-I 'D: \ Program \ OpenSSL-1.1.0 \ include". Ваша ссылка должна включать что-то вроде '-L" D: \ Program \ OpenSSL-1.1.0 \ lib "'. – jww

ответ

1

Я не имею ту же установку, чтобы попробовать, но предоставленная информация кажется достаточно ясным. Linker не может найти функции из библиотеки ssl, поэтому вам нужно сосредоточиться на ссылке ssl. Я думаю, что сценарий выпуска может быть сведен к простой основной функции, вызывающей OPENSSL_init_ssl() (параметры не имеют значения, так как вы не собираетесь ее выполнять) и процесс сборки, связанный только с openssl. Разрешение этого сбоя связывания поможет решить ваш текущий случай. Так что пусть Google и SO будут с тобой :)

PS Я бы предпочел все это вставить в комментарий, но этим новичкам не разрешено.

Edit:

После устранения неисправностей (проверьте комментарии ниже) показали фактическую причину. Система имеет несколько экземпляров libssl (например, некоторые установки для приложений привезли другую версию), а используемый компоновщик экземпляр не подходит для текущей сборки (например, 32-разрядная версия при создании 64-битного приложения). Таким образом, решение заключалось в том, чтобы установить компоновщик в подробный режим и проверить, соответствуют ли пути библиотеки.

+0

Привет, делая то, что вы предложили, произвел ту же самую ошибку, что и раньше (ну, во всяком случае, один из них). У вас есть идея, как я могу попытаться разрешить это или, по крайней мере, получить лучшее представление о том, что происходит не так? – Omega1001

+0

Ну, компоновщик не говорит «не могу найти -ssl», поэтому он может найти lib, но не может получить необходимые символы. Первое, что я хотел бы проверить, - это ли libssl для той же платформы, что и main.o, созданной компилятором. Возможно, что компилятор по умолчанию имеет x64, а openssl предназначен для 32-битного или наоборот. Проверьте [здесь] (http://stackoverflow.com/questions/9260948/how-to-see-the-compilation-platform-of-a-static-library-file) и, возможно, [здесь] (http: // stackoverflow .com/questions/8659694/how-can-i-tell-if-my-gcc-is-compiling-64bit-by-default) –

+0

Еще несколько вещей, которые нужно упомянуть: –

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