我正在使用windows subsystem for linux WSL在clion上编译一个测试程序。我正在使用dlopen等在运行时加载库。我得到的错误是:
CMakeFiles/test.dir/test_add.cpp.o: In function `test_test_add_windows_Test::TestBody()':
/mnt/d/ACrossPlatformCppLibrary/test/test_add.cpp:26: undefined reference to `dlopen'
/mnt/d/ACrossPlatformCppLibrary/test/test_add.cpp:28: undefined reference to `dlsym'Reports似乎建议我需要链接到ld。但是,添加
target_link_libraries(ACrossPlatformCppLibrary "${CMAKE_DL_LIBS}")
不工作,这并不奇怪,因为它看起来"${CMAKE_DL_LIBS}"在windows上是空的。所以我尝试手动给出ld的路径
target_link_libraries(ACrossPlatformCppLibrary "/usr/bin/ld")
有人知道如何在WSL上链接到ld吗
更新
多亏了@squareskittle的评论和答案,我注意到dl二进制文件在系统路径上不可用。仔细检查一下,WSL中根本不存在dl二进制文件。下面是我认为dl应该在的目录的剪切和粘贴:
$ cd /lib
$ ls
apparmor hdparm libhandle.so.1.0.3 netplan udev
console-setup init lsb open-iscsi ufw
cpp klibc-wBFLvVtxy4xJqEadIBJMa78iJz8.so modprobe.d recovery-mode x86_64-linux-gnu
cryptsetup **ld-linux.so.2** modules systemd
ebtables libhandle.so.1 modules-load.d terminfo发布于 2020-02-26 07:03:18
我认为您混淆了GNU链接库标志-l和库名称dl,它们在链接阶段一起显示为-ldl。如果库位于(WSL的)系统路径中,则也不需要库的完整路径。您可以简单地将库名dl放在此命令中:
target_link_libraries(ACrossPlatformCppLibrary PRIVATE dl)值得注意的是,如果您安装了适当的软件包,则WSL上的libdl.so库应该位于以下位置:
/lib/x86_64-linux-gnu/libdl.so.2https://stackoverflow.com/questions/60403761
复制相似问题