命令行中缺少DSO(使用CMake)

DSO missing from command line (With CMake)

本文关键字:使用 CMake DSO 命令行      更新时间:2023-10-16

我正试图通过用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

我如何告诉CMake链接在源目录中的静态库?

如何在cmake文件中添加链接器或编译标志?

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

谢谢

在没有看到CMake文件本身的情况下很难猜测出什么问题,但这里有一些可能的解决方案。

基于您的第一个参考答案中的类似错误(命令行中缺少DSO),似乎您可能只是忘记链接到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

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

发生的事情是CMakeLists.txt很可能在:

中丢失了一个库
TARGET_LINK_LIBRARIES( youApp
  library1
  library2
)

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