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

Rab*_*ahu 7 cmake

在CMake中,我们使用TARGET_LINK_LIBRARIES()将共享库链接到库/可执行文件.

For example:
TARGET_LINK_LIBRARIES(ExecutableName xxx)
   where ExecutableName - is the name of executable
         xxx - is the library name.
Run Code Online (Sandbox Code Playgroud)

据我所知,CMake在LINK_DIRECTORIES()宏中提到的路径中搜索"libxxx.so".但是如果我有一个名为"libxxx.a"的第三方库,那么如何使用CMake将库链接到可执行文件.

提前谢谢你的帮助!

Com*_*sMS 5

您应该始终尝试将完整路径或CMake目标提供给target_link_libraries。

由于您似乎并未在CMake项目中建立依赖关系,因此获取要链接的CMake目标的唯一方法是创建一个导入目标。手动进行操作通常很繁琐,因此除非依赖项已经提供了带有导入目标的配置文件,否则您可能不想走这条路。导入的目标是最方便使用的,但前提是您可以让CMake为您编写目标。

因此,那就是绝对路径。您显然不想在CMakeLists中对绝对库路径进行硬编码。正如您在问题中指出的那样,所需的行为是仅指定库的名称,并且CMake应该能够自动找出其位置。这正是find_library为您服务的。

要链接到库xxx,您可以执行以下操作:

find_library(LIB_LOCATION xxx)
target_link_libraries(ExecutableName ${LIB_LOCATION})
Run Code Online (Sandbox Code Playgroud)

请注意,它find_library提供了大量选项,可以进一步指定在何处查找请求的库。摆脱您现有的link_directories呼叫,并添加相应的路径作为提示find_library

当您将CMake代码移植到其他平台时,这种方法不仅更加灵活,而且如果出现问题,与初始方法相比,它更易于调试。

  • 如何告诉 find_library 寻找静态库?find_library(CURL_LIBRARY_LIB_LOCATION curl) 仍然打印路径“/usr/lib/x86_64-linux-gnu/libcurl.so”。 (2认同)

tre*_*nki 2

只需指定库文件名就可以了:

TARGET_LINK_LIBRARIES(ExecutableName libxxx.a)
Run Code Online (Sandbox Code Playgroud)

TARGET_LINK_LIBRARIES(ExecutableName xxx)
Run Code Online (Sandbox Code Playgroud)

实际上也应该可以工作,因为它不会在搜索路径中查找 .so 而是查找 libxxx.a 文件。