在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将库链接到可执行文件.
提前谢谢你的帮助!
您应该始终尝试将完整路径或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代码移植到其他平台时,这种方法不仅更加灵活,而且如果出现问题,与初始方法相比,它更易于调试。
只需指定库文件名就可以了:
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 文件。
| 归档时间: |
|
| 查看次数: |
27078 次 |
| 最近记录: |