libshout构建对SSL_is_init_finished的未定义引用

时间:2016-12-23 11:30:02

标签: c++ ssl gcc openssl cygwin

我目前正在尝试使用libshout构建一个简单的IceCast供应商。

不幸的是,我无法解决一些链接器错误:

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

我使用的是CygWin的GCC 64位版本,但是如果需要还可以编译32版本。 使用make

触发构建

到目前为止我的实际代码非常基本(我只是刚开始使用这个库)

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

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

我在此Order(-l)中使用以下库作为链接器: 喊叫 - &gt;我尝试使用的实际库 Vorbis格式 OGG SSL 加密

从错误的角度来看,我认为这与ssl有某种关系,但我确实包含了那些不是我的错误? 我已经尝试过旋转顺序,但这只会产生更多错误,所以我认为订单是正确的......

修改1

正如nnovich-OK建议的那样,我改变了我的代码来检查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

我发现来自ssl.h的OPENSSL_init_ssl存在问题,但是来自crypto.h的OPENSSL_init没有问题(ssl.h包含了女实习生)

这会让任何人有任何想法吗?

解决此问题的任何提示都表示赞赏

1 个答案:

答案 0 :(得分:1)

我没有尝试相同的设置,但提供的信息似乎足够清晰。链接器无法从ssl库中找到函数,因此您需要专注于链接ssl。我认为,问题场景可以简化为简单的主函数调用OPENSSL_init_ssl()(参数不重要,因为你不打算执行它)和构建过程只涉及链接openssl。解决此链接失败将有助于解决您当前的情况。所以让谷歌和SO一起陪伴你:)

PS我宁愿把所有这些都置于评论之中,但是新人并没有被允许。

修改

后续的故障排除(检查下面的评论)揭示了实际的根本原因。系统有几个libssl实例(例如某些应用程序安装带来另一个版本)和链接器使用的实例不适合当前构建(例如构建64位应用程序中的32位版本)。所以解决方案是将链接器置于详细模式并检查库路径是否符合预期。