Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用CMake将静态库链接到可执行文件_Cmake - Fatal编程技术网

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

如何使用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”。 但是,如

在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”。 但是,如果我有一个名为“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})