如何使用CMake将静态库链接到可执行文件

时间:2015-02-16 07:26:53

标签: cmake

在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将库链接到可执行文件。

提前感谢您的帮助!

2 个答案:

答案 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文件。