如何使用CMake将静态库链接到可执行文件
在CMake中,我们使用TARGET_LINK_LIBRARIES()将共享库链接到库/可执行文件如何使用CMake将静态库链接到可执行文件,cmake,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在LINK_DIRECTORIES()宏中提到的路径上搜索“libxxx.so”。 但是,如
For example:
TARGET_LINK_LIBRARIES(ExecutableName xxx)
where ExecutableName - is the name of executable
xxx - is the library name.
据我所知,CMake在LINK_DIRECTORIES()宏中提到的路径上搜索“libxxx.so”。
但是,如果我有一个名为“libxxx.a”的第三方库,那么如何使用CMake将该库链接到可执行文件
提前感谢您的帮助 只需指定库文件名即可:
TARGET_LINK_LIBRARIES(ExecutableName libxxx.a)
及
实际上也应该这样做,因为这不会在搜索路径中查找.so,而是查找libxxx.a文件。您应该始终尝试为目标链接库提供完整路径或CMake目标 由于您似乎没有将依赖项作为CMake项目的一部分进行构建,因此获得要链接的CMake目标的唯一方法是创建导入的目标。这通常是非常乏味的manuall操作,所以除非依赖项已经提供了一个带有导入目标的配置文件,否则您可能不想走这条路。导入的目标是最方便使用的,但前提是您可以让CMake为您编写目标 所以,绝对路径就是这样。显然,您不希望在CmakeList中硬编码绝对库路径。正如您在问题中指出的,所需的行为是只指定库的名称,CMake应该能够自动确定其位置。这正是你所需要的 要链接库
xxx
,您可以执行以下操作:
find_library(LIB_LOCATION xxx)
target_link_libraries(ExecutableName ${LIB_LOCATION})
请注意,find_library
提供了大量选项来进一步指定在何处查找请求的库。取消现有的link\u目录
调用,将相应的路径作为提示添加到find\u库
这种方法在将CMake代码移植到其他平台时更加灵活,并且在出现问题时比最初的方法更容易调试。如何告诉find_library查找静态库?find_library(CURL_library_LOCATION CURL)仍然打印路径“/usr/LIB/x86_64-linux-gnu/libcurl.so”。@BTRNaidu在这种情况下,您应该这样做。请注意,您可以指定多个要搜索的名称,以
find_library
。所以最后一个命令看起来像:find\u library(l名称为libcurl.a curl)
。我同意这不是最漂亮的解决方案,但如果你有静态和动态版本,这是目前唯一能告诉CMake采用哪种解决方案的方法。
find_library(LIB_LOCATION xxx)
target_link_libraries(ExecutableName ${LIB_LOCATION})