跳转至

Cmake链接相关整理

原文地址

https://blog.csdn.net/qq_21438461/article/details/127960337

简述

指定库路径

链接时使用绝对路径方式

  • find_library():查找/指定所需的库(推荐).
  • link_directories():指定第三方库所在路径(只有在生成target之前调用才会有效, 即需要放在ADD_EXECUTABLE()之前调用)
  • link_libraries():添加需要链接的库文件路径,注意这里是全路径,(不推荐)

指定需要头文件的路径

  • include_directories():添加头文件路径到编译器的头文件搜索路径下,多个路径以空格分隔.

其他

  • find_path():和find_library()类似,find_path()可以用来找任何文件.
  • find_package():引入外部依赖包.

链接目标

  • target_link_libraries:指定目标(exe或者so文件)需要包含的库
  • target_include_directories:指定目标(exe或者so文件)需要包含的头文件路径

语法

添加需要链接的库文件目录

指定第三方库所在路径,比如,你的动态库在/home/myproject/libs这个路径下,则通过命令:LINK_DIRECTORIES(/home/myproject/libs),把该路径添加到第三方库搜索路径中,这样就可以使用相对路径了,使用TARGET_LINK_LIBRARIES的时候,只需要给出动态链接库的名字就行了。

link_directories([AFTER|BEFORE] directory1 [directory2 ...])
# Adds the paths in which the linker should search for libraries. 
# Relative paths given to this command are interpreted as relative to the current source directory.
# The command will apply only to targets created after it is called.

添加需要链接的库文件路径,注意这里是全路径 添加链接器将在其中查找库的目录

link_libraries([item1 [item2 [...]]]
               [[debug|optimized|general] <item>] ...)
# Specify libraries or flags to use when linking any targets created later in the current directory or below by commands such as add_executable() or add_library(). 
# See the target_link_libraries() command for meaning of arguments.

find_library

查找库

此命令用于查找库。创建一个缓存条目,或者一个普通变量,如果指定了 NO_CACHE ,由 命名来存储这个命令的结果。如果找到库,结果将存储在变量中,除非清除变量,否则不会重复搜索。如果什么也没找到,结果将是 -NOTFOUND 。 通常指定NAMESHINTS即可.

#A short-hand signature is:
find_library (<VAR> name1 [path1 path2 ...])
#The general signature is:
find_library (
          <VAR>
          name | NAMES name1 [name2 ...] [NAMES_PER_DIR]
          [HINTS [path | ENV var]... ]
          [PATHS [path | ENV var]... ]
          [REGISTRY_VIEW (64|32|64_32|32_64|HOST|TARGET|BOTH)]
          [PATH_SUFFIXES suffix1 [suffix2 ...]]
          [VALIDATOR function]
          [DOC "cache documentation string"]
          [NO_CACHE]
          [REQUIRED]
          [NO_DEFAULT_PATH]
          [NO_PACKAGE_ROOT_PATH]
          [NO_CMAKE_PATH]
          [NO_CMAKE_ENVIRONMENT_PATH]
          [NO_SYSTEM_ENVIRONMENT_PATH]
          [NO_CMAKE_SYSTEM_PATH]
          [NO_CMAKE_INSTALL_PREFIX]
          [CMAKE_FIND_ROOT_PATH_BOTH |
           ONLY_CMAKE_FIND_ROOT_PATH |
           NO_CMAKE_FIND_ROOT_PATH]
         )

find_library参数

NAMES

为库指定一个或多个可能的名称。

当使用这个来指定有版本后缀和没有版本后缀的名称时,我们建议先指定没有版本的名称,这样就可以在发行版提供的软件包之前找到本地构建的软件包。

HINTS, PATHS

除了默认位置,还指定要搜索的目录。该 ENV var 子选项读取系统环境变量的路径。

在 3.24 版更改: 在 Windows 平台上,可以使用专用语法将注册表查询作为目录的一部分。在所有其他平台上,此类规范将被忽略。

REGISTRY_VIEW

3.24版的新内容。

指定必须查询哪些注册表视图。此选项仅在 Windows 平台上有意义,在其他平台上将被忽略。如果未指定,则在 CMP0134 策略为 NEW 时使用 TARGET 视图。策略为 OLD 时的默认视图,请参阅 CMP0134 。 CMP0134 NEW CMP0134 OLD

64

查询 64 位注册表。在 32 位 Windows 上,它始终返回字符串 /REGISTRY-NOTFOUND 。

32

查询32位注册表。

64_32

查询两个视图( 64 和 32 )并为每个视图生成路径。

32_64

查询两个视图( 32 和 64 )并为每个视图生成路径。

HOST

查询与主机架构匹配的注册表: 64 位Windows为64,32位Windows为 32 。

TARGET

查询与 CMAKE_SIZEOF_VOID_P 变量指定的体系结构匹配的注册表。如果未定义,则回退到 HOST 视图。

BOTH

查询两个视图( 32 和 64 )。顺序取决于以下规则: 如果定义了 CMAKE_SIZEOF_VOID_P 变量,请根据该变量的内容使用以下视图:

  • 8: 64_32
  • 4: 32_64

如果没有定义 CMAKE_SIZEOF_VOID_P 变量,依赖主机的架构:

  • 64-bit: 64_32
  • 32-bit: 32

PATH_SUFFIXES

在每个目录位置下面指定额外的子目录进行检查,否则视为无效。

DOC

指定 缓存条目的文档字符串。

NO_CACHE

3.21版中的新内容。

搜索的结果将被存储在一个普通的变量中,而不是缓存条目。

Note

如果该变量在调用前已经被设置(作为普通变量或缓存变量),那么搜索将不会发生。

Warning

这个选项应该谨慎使用,因为它可能大大增加重复配置步骤的成本。

REQUIRED

3.18版本中的新功能。

如果没有找到,则停止处理,并发出错误信息,否则在下一次用相同的变量调用find_library时,将再次尝试搜索。

如果指定了 NO_DEFAULT_PATH ,则不会将其他路径添加到搜索中。如果未指定 NO_DEFAULT_PATH ,则搜索过程如下:

  • 3.12版中的新增功能:如果从查找模块中调用或由对 find_package() 的调用加载的任何其他脚本中调用,则搜索前缀对于要查找的当前包是唯一的。具体来说,请查看 _ROOT CMake变量和 _ROOT 环境变量。包的根变量作为堆栈维护,因此,如果从嵌套查找模块或配置包中调用,则将在当前模块或包的路径之后搜索父级查找模块或配置包的根路径。换句话说,搜索顺序为 _ROOT , ENV{_ROOT} , _ROOT , ENV{_ROOT} 等等。如果传递了 NO_PACKAGE_ROOT_PATH 或将 CMAKE_FIND_USE_PACKAGE_ROOT_PATH 设置为 FALSE ,则可以跳过此操作。请参阅策略 CMP0074 。
    • /lib/ (如果已设置 CMAKE_LIBRARY_ARCHITECTURE ),并且 /lib _ROOT CMake变量和 _ROOT 环境变量中的每个 prefix 的 / lib(如果已从由加载的find模块中调用) find_package()
  • 在特定于 cmake 的缓存变量中指定的搜索路径。这些旨在通过 -DVAR=value 在命令行上使用。这些值被解释为分号分隔的列表。 NO_CMAKE_PATH 或将 CMAKE_FIND_USE_CMAKE_PATH 设置为 FALSE ,则可以跳过此操作。
    • /lib/ 如果 CMAKE_LIBRARY_ARCHITECTURE 被设置,并 /lib 用于每个 prefix 在 CMAKE_PREFIX_PATH
    • CMAKE_LIBRARY_PATH
    • CMAKE_FRAMEWORK_PATH
  • 在特定于cmake的环境变量中指定的搜索路径。这些意在用户的外壳配置进行设置,并因此使用主机的本地路径分隔( ; 在Windows和 : 在UNIX上)。这可如果跳过 NO_CMAKE_ENVIRONMENT_PATH 传递或通过设置 CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH 到 FALSE 。
    • /lib/ 如果 CMAKE_LIBRARY_ARCHITECTURE 被设置,并 /lib 用于每个 prefix在 CMAKE_PREFIX_PATH
    • CMAKE_LIBRARY_PATH
    • CMAKE_FRAMEWORK_PATH 搜索“ HINTS 选项指定的路径。这些应该是系统自省计算的路径,例如已经找到的另一个项目的位置所提供的提示。硬编码的猜测应使用 PATHS 选项指定。

搜索标准系统环境变量。这可如果跳过 NO_SYSTEM_ENVIRONMENT_PATH 传递或通过设置 CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH 到 FALSE 。

    • LIB 和 PATH 中的目录。
    • 在Windows主机: /lib/ 如果 CMAKE_LIBRARY_ARCHITECTURE 是集,而 /lib 用于每个 prefix/[s]bin 在 PATH ,和 /lib 用于其他条目 PATH 。

搜索当前系统的 Platform 文件中定义的 cmake 变量。 NO_CMAKE_INSTALL_PREFIX 或将 CMAKE_FIND_USE_INSTALL_PREFIX 设置为 FALSE ,则可以跳过 CMAKE_INSTALL_PREFIX 和 CMAKE_STAGING_PREFIX 的搜索。 NO_CMAKE_SYSTEM_PATH 或将 CMAKE_FIND_USE_CMAKE_SYSTEM_PATH 设置为 FALSE ,则可以跳过所有这些位置。 NO_CMAKE_INSTALL_PREFIX CMAKE_FIND_USE_INSTALL_PREFIX FALSE NO_CMAKE_SYSTEM_PATH CMAKE_FIND_USE_CMAKE_SYSTEM_PATH FALSE

  • /lib/ 如果 CMAKE_LIBRARY_ARCHITECTURE 被设置,并 /lib 用于每个 prefix 在
  • CMAKE_SYSTEM_PREFIX_PATH
  • CMAKE_SYSTEM_LIBRARY_PATH
  • CMAKE_SYSTEM_FRAMEWORK_PATH

这些变量包含的平台路径是通常包含已安装软件的位置。对于基于UNIX的平台,示例为 /usr/local 。

查询两个视图( 32 和 64 )。顺序取决于以下规则: 如果定义了 CMAKE_SIZEOF_VOID_P 变量,请根据该变量的内容使用以下视图:

  • 8: 64_32
  • 4: 32_64

如果没有定义 CMAKE_SIZEOF_VOID_P 变量,依赖主机的架构:

  • 64-bit: 64_32
  • 32-bit: 32

搜索PATHS选项或命令的简写版中指定的路径。这些通常是硬编码的猜测.