在CMake中,我们使用TARGET_LINK_LIBRARIES()将共享库链接到库/可执行文件。
For example:
TARGET_LINK_LIBRARIES(ExecutableName xxx)
where ExecutableName - is the name of executable
xxx - is the library name.
据我所知,CMake搜索" libxxx.so"在LINK_DIRECTORIES()宏中提到的路径。 但是,如果我有一个名为" libxxx.a"的第三方图书馆。那么如何使用CMake将库链接到可执行文件。
提前感谢您的帮助!
答案 0 :(得分:4)
您应该始终尝试将完整路径或CMake目标提供给target_link_libraries。
由于您似乎没有将依赖关系构建为CMake项目的一部分,因此获取要链接的CMake目标的唯一方法是创建导入的目标。这通常是非常繁琐的manuall,所以除非依赖已经提供了带有导入目标的配置文件,否则你可能不想走这条路。导入目标是最方便使用的,但前提是你可以让CMake为你编写。
那么,那就是绝对路径。您显然不希望在CMakeLists中对绝对库路径进行硬编码。正如您的问题所指出的,所需的行为是您只指定库的名称,CMake应该能够自动确定其位置。这正是find_library
为您所做的。
要链接到库xxx
,您可以执行以下操作:
find_library(LIB_LOCATION xxx)
target_link_libraries(ExecutableName ${LIB_LOCATION})
请注意,find_library
提供了大量选项来进一步指定查找所请求库的位置。摆脱现有的link_directories
电话,并将相应的路径作为提示添加到find_library
。
将CMake代码移植到其他平台时,这种方法更灵活,如果出现问题,则比初始方法更容易调试。
答案 1 :(得分:2)
只需指定库文件名即可:
TARGET_LINK_LIBRARIES(ExecutableName libxxx.a)
和
TARGET_LINK_LIBRARIES(ExecutableName xxx)
实际上也应该工作,因为它不会查找.so但是搜索路径中的libxxx.a文件。