我是Linux的新手。我在CMakeLists.txt中看到以下内容;
target_link_libraries(app wiringPi
serializer
iothub_client
iothub_client_mqtt_transport
umqtt
aziotsharedutil
ssl
crypto
curl
pthread
m
ssl
crypto)
我的问题/理解是;通过这样做
ldconfig -p | grep <libraryname>
时,对于上述库
有时我会发现类似以下的输出,有时什么也没有,为什么?/usr/lib/arm-linux-gnueabihf
pi @ raspberrypi:〜$ ldconfig -p | grep curl
libcurl.so.4(libc6,hard-float)=> /usr/lib/arm-linux-gnueabihf/libcurl.so.4
libcurl-gnutls.so.4(libc6,hard-float)=> /usr/lib/arm-linux-gnueabihf/libcurl-gnutls.so.4pi @ raspberrypi:〜$ ldconfig -p | grepconnectionPi
libwiringPiDev.so(libc6,float)=> /usr/local/lib/libwiringPiDev.so
libwiringPiDev.so(libc6,float)=> /usr/lib/libwiringPiDev.so
libwiringPi.so(libc6,float)=> /usr/local/lib/libwiringPi.so
libwiringPi.so(libc6,float)=> /usr/lib/libwiringPi.so
答案 0 :(得分:1)
- 我们是否告诉CMake工具构建connectionPi,串行器等并与app(这是在我的代码中创建的可执行文件)链接?
不完全是。该命令告诉CMake,必须在目标的链接阶段将库wiringPi
,serializer
,等链接到目标“ app”。它没有说明如何自行构建库,通常期望它们已经可用而不是构建。
- 这些库都在哪里?
它可能会有所不同。编译器具有在其中查找库的目录的默认列表。其他CMake命令可以添加将目录添加到该列表的链接选项。
- 当我做
ldconfig -p | grep <libraryname>
时,对于上述库,有时我会找到类似以下的输出,有时 没什么,为什么呢?
ldconfig
报告 dynamic 链接器已知的库。这与在编译时运行的链接器不同,并且两者知道的目录和库不一定相同。 ldconfig
可能未列出给定库的原因包括:
- target_link_libraries是否足够聪明,可以在子目录下查找库?我的意思是,我看到有些
user/lib
之下有一些,而有些/usr/lib/arm-linux-gnueabihf
之下还有一层。
这不是CMake的功能,而是选定的工具链及其配置(在Linux上,通常是带有GCC的GNU工具链)。通常可以假设默认情况下工具链使用所有正确的 standard 库目录。有时也可以成功指示CMake在其他可能的位置搜索特定的库,但是target_link_libraries
并不是其中的一部分。
答案 1 :(得分:1)
当您将不是目标的纯名称(而不是路径)传递给((APlayerWeapon *)Weapon->GetChildActor())->Shoot();
时,CMake只会将此名称转换为链接器标志。例如。在Linux上,这是标志
target_link_libraries
因此,有关搜索库的问题可能会直接指向链接程序-CMake在此处不可用。