【问题标题】:libshout build undefined reference to SSL_is_init_finishedlibshout 构建对 SSL_is_init_finished 的未定义引用
【发布时间】:2017-05-09 02:39:15
【问题描述】:

我目前正在尝试使用 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) 中使用以下库作为链接器: 喊叫->我尝试使用的实际库 沃尔比斯 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 包含女巫实习生)

这会让任何人知道吗?

感谢任何解决此问题的提示

【问题讨论】:

  • OpenSSL 的 Cygwin 系统版本为 1.0.2j(在撰写本文时)。 SSL_is_init_finished 是 OpenSSL 1.1.0 的一部分。我没有看到指示您使用的是 1.1.0 版本的编译命令。至少,我希望看到像-I "D:\Programme\OpenSSL-1.1.0\include" 这样的东西。你的链接命令应该包含类似-L "D:\Programme\OpenSSL-1.1.0\lib"

标签: c++ ssl gcc openssl cygwin


【解决方案1】:

我没有相同的设置可以尝试,但提供的信息似乎很清楚。链接器无法从 ssl 库中找到函数,因此您需要专注于链接 ssl。我认为,问题场景可以简化为调用 OPENSSL_init_ssl() 的简单主函数(参数无关紧要,因为您不会执行它)和仅涉及链接 openssl 的构建过程。解决此链接失败将有助于解决您当前的情况。所以让 Google 和 SO 与您同在 :)

PS 我宁愿把所有这些都放在评论中,但是不允许新人这样做。

编辑:

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

【讨论】:

  • 您好,按照您的建议进行操作会产生与我之前遇到的完全相同的错误(无论如何都是其中之一)。你有什么想法我可以尝试解决这个问题,或者至少更好地了解出了什么问题?
  • 嗯,链接器没有说“找不到-lssl”,所以它可以找到lib,但不能得到必要的符号。我要检查的第一件事是 libssl 是否适用于与编译器生成的 main.o 相同的平台。有可能编译器默认以 x64 为目标,而 openssl 用于 32 位,反之亦然。检查here,也许here
  • 还有几件事要提:
  • a) 我遇到了this topic,描述了 openssl 初始化的变化。看起来 OPENSSL_init_ssl() 不在旧版本中。确保您的 openssl 是最新的。我建议直接检查,库 libssl 在符号列表中包含此函数look at most liked answer here
  • b) 确保 ld 从正确的路径链接正确的库。我有使用小型个人应用程序的经验,具体取决于适用于 Windows x64 的 SDL lib。我把必要的 SDL 库放到了我的系统中,但是链接器找到了 32 位平台的 SDL 库,这是以前一些 Steam 游戏带来的,并且构建失败。我建议将链接器置于详细模式,以便打印完整的库路径,并检查库路径是否符合预期。快速谷歌搜索(点这里)[groups.google.com/forum/#!topic/gnu.gcc.help/4opcAQF6wyo]
猜你喜欢
  • 2018-09-02
  • 1970-01-01
  • 1970-01-01
  • 2021-07-02
  • 1970-01-01
  • 2015-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多