【问题标题】:DSO missing from command line (With CMake)命令行中缺少 DSO(使用 CMake)
【发布时间】:2017-02-25 13:41:23
【问题描述】:

我正在尝试通过使用 Cmake 再次编译所有内容来将 c++ 项目从 Windows 转换为 Debian。

我不太习惯在 Linux 上工作,但我已经设法正确安装了所有东西。

这是错误:

/usr/bin/ld: ../shared/libshared.a(BigNumber.cpp.o): undefined reference to symbol 'BN_new@@OPENSSL_1.0.2d'

//usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.2: error adding symbols: DSO missing from command line

这实际上似乎是一个常见问题,但我不知道如何处理 Cmake。我已经看到了几个答案,例如:

DSO missing from command line

How do I tell CMake to link in a static library in the source directory?

How to add linker or compile flag in cmake file?

我有点困惑,你能帮我理解一下我需要用 Cmake 做什么吗?

谢谢

【问题讨论】:

  • 你能解决这个问题吗?你做了哪些改变来解决这个问题?我也有类似的问题

标签: c++ linux cmake libcrypto


【解决方案1】:

如果不查看 CMake 文件本身,很难猜测可能出了什么问题,但这里有一些可能的解决方案。

根据您第一个引用的答案 (DSO missing from command line) 中的类似错误,您似乎只是忘记了链接到 libcrypto.so.1.0.2 库(或者也可能错过了 ssl 库)。以我的经验,这些通常是串联使用的,因此您可能需要将两者链接起来。使用target_link_libraries 命令将这些库链接到您的 CMake 目标:

target_link_libraries(MyLib PRIVATE ssl crypto)

我还看到了由于 OpenSSL 版本中的不匹配而出现此错误的情况。例如,您的机器上可能安装了 OpenSSL 版本 1.1,但您使用的库或包需要版本 1.0.2(如错误所示)。如果是这种情况,您可以卸载当前的 OpenSSL 版本 (1.1) 并安装旧版本 (1.0.2):

apt-get purge libssl-dev
apt-get install libssl1.0-dev

【讨论】:

    【解决方案2】:

    您收到的错误是关于在 BigNumber.cpp 文件中调用的函数缺少链接。

    发生的事情是CMakeLists.txt 很可能缺少以下库:

    TARGET_LINK_LIBRARIES( youApp
      library1
      library2
    )
    

    PS:调用库的顺序对于让链接器正常工作也很重要。

    【讨论】:

    • 您好 MSIS,感谢您的回答。所以我试图在我的 CMakeLists.txt 中添加它,但我认为我的目标是错误的。你认为我需要瞄准别的东西吗?因为我这样做了 TARGET_LINK_LIBRARIES("path/BigNumber.cpp" "/usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.2")
    • 抱歉,我按下了 Enter,只是为了补充一点,如果我尝试定位此 .cpp,我会收到此错误(无法为目标“.../BigNumber.cpp”指定链接库,即不是由这个项目建造的。)
    猜你喜欢
    • 2016-01-20
    • 2019-01-12
    • 1970-01-01
    • 2016-11-17
    • 2014-07-28
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    • 2021-05-18
    相关资源
    最近更新 更多