有人知道如何 link 对抗 `WSL` 上的 `ld` 吗?
Does anybody know how to link against `ld` on `WSL`?
我正在使用 windows 子系统为 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 似乎暗示我需要 link 反对 ld
。但是,添加
target_link_libraries(ACrossPlatformCppLibrary "${CMAKE_DL_LIBS}")
不起作用,这并不奇怪,因为它看起来 "${CMAKE_DL_LIBS}"
在 windows 上是空的。所以我尝试手动给出 ld
的路径
target_link_libraries(ACrossPlatformCppLibrary "/usr/bin/ld")
有人知道如何在 WSL
上 link 对抗 ld
吗?
更新
感谢@squareskittles 的评论和回答,我注意到 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
我认为您将 GNU link 库标志 -l
与库名称 dl
混淆了,它们在 link 阶段一起显示为 -ldl
.如果库位于(WSL 的)系统路径中,则您也不需要库的完整路径。您可以简单地将库名称 dl
放入此命令中:
target_link_libraries(ACrossPlatformCppLibrary PRIVATE dl)
对于它的价值,如果您安装了正确的软件包,WSL 上的 libdl.so
库应该位于此处:
/lib/x86_64-linux-gnu/libdl.so.2
我正在使用 windows 子系统为 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 似乎暗示我需要 link 反对 ld
。但是,添加
target_link_libraries(ACrossPlatformCppLibrary "${CMAKE_DL_LIBS}")
不起作用,这并不奇怪,因为它看起来 "${CMAKE_DL_LIBS}"
在 windows 上是空的。所以我尝试手动给出 ld
target_link_libraries(ACrossPlatformCppLibrary "/usr/bin/ld")
有人知道如何在 WSL
上 link 对抗 ld
吗?
更新
感谢@squareskittles 的评论和回答,我注意到 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
我认为您将 GNU link 库标志 -l
与库名称 dl
混淆了,它们在 link 阶段一起显示为 -ldl
.如果库位于(WSL 的)系统路径中,则您也不需要库的完整路径。您可以简单地将库名称 dl
放入此命令中:
target_link_libraries(ACrossPlatformCppLibrary PRIVATE dl)
对于它的价值,如果您安装了正确的软件包,WSL 上的 libdl.so
库应该位于此处:
/lib/x86_64-linux-gnu/libdl.so.2