我是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.4
pi @ raspberrypi:〜$ ldconfig -p | grep wiringPi libwiringPiDev.so(libc6,hard-float)=> /usr/local/lib/libwiringPiDev.so libwiringPiDev.so(libc6,hard-float)=> /usr/lib/libwiringPiDev.so libwiringPi.so(libc6,hard-float)=> /usr/local/lib/libwiringPi.so libwiringPi.so(libc6,hard-float)=> /usr/lib/libwiringPi.so
- 我们是否告诉CMake工具构建wiringPi,序列化器等并与app(这是我的代码中创建的可执行文件)链接?
不完全是。该命令告诉CMake库wiringPi
,serializer
等必须在该目标的链接阶段链接到目标'app'。它没有说明自己构建库,通常它们已经可用而不是构建。
- 所有这些图书馆在哪里?
它可以变化。编译器有一个默认的目录列表,用于查找库。其他CMake命令可以添加将目录添加到该列表的链接选项。
- 当我做
ldconfig -p | grep <libraryname>
时,对于上面的库有时我会发现如下的输出,有时候什么都没有,为什么呢?
ldconfig
报告动态链接器已知的库。这与在编译时运行的链接器不同,并且两者知道的目录和库不一定相同。 ldconfig
可能未列出给定库的原因包括:
- target_link_libraries是否足够聪明,可以在子目录下查找库?我的意思是我看到有些只是在
user/lib
下,有些是在/usr/lib/arm-linux-gnueabihf
之下的一个级别
这不是CMake的功能,而是选择的工具链及其配置(在Linux上,通常是GNU工具链,以GCC为特色)。通常可以安全地假设工具链默认使用所有正确的标准库目录。有时可以成功地指示CMake在其他可能的地方搜索特定的库,但target_link_libraries
不是其中的一部分。
当您向target_link_libraries
传递一个不是目标的普通名称(不是路径)时,CMake只会将此名称转换为链接器标志。例如。在Linux上这是标志
-l<library-name>
所以关于搜索库的问题你可以直接联系到链接器--Cake在这里不在游戏中。