CMP0003

警告

此策略的 OLD 行为已在 CMake 4.0 版本中移除。此策略必须通过调用 cmake_minimum_required()cmake_policy() 设置为 NEW

通过完整路径链接的库不再生成链接器搜索路径。

此策略影响在链接时如何查找完整路径未知的库,但它的创建是由于 CMake 处理完整路径已知的库的方式发生了变化。考虑以下代码

target_link_libraries(myexe /path/to/libA.so)

CMake 2.4 及更低版本通过将已知完整路径的库在链接行上拆分为由链接器搜索路径和库名称组成的单独组件来实现链接。示例代码可能生成类似如下的内容

... -L/path/to -lA ...

以便链接到库 A。已执行分析来对多个链接目录进行排序,以便链接器在所需位置找到库 A,但在某些情况下这不起作用。CMake 2.6 及更高版本使用更可靠的方法,在大多数情况下,将库的完整路径直接传递给链接器。示例代码现在生成类似如下的内容

... /path/to/libA.so ....

不幸的是,此更改可能会破坏如下代码

target_link_libraries(myexe /path/to/libA.so B)

其中 B 旨在查找 /path/to/libB.so。此代码是错误的,因为用户要求链接器查找库 B,但未提供链接器搜索路径(可以使用 link_directories 命令添加)。但是,使用旧的链接实现,代码会意外地工作,因为为库 A 添加的链接器搜索路径允许找到库 B。

为了支持依赖于通过链接到已知完整路径的库而添加的链接器搜索路径的项目,此策略的 OLD 行为将添加链接器搜索路径,即使它们不是自身库所需要的。当此策略设置为 OLD 时,CMake 将生成如下链接行

... -L/path/to /path/to/libA.so -lB ...

这将允许像以前一样找到库 B。当此策略设置为 NEW 时,CMake 将生成如下链接行

... /path/to/libA.so -lB ...

这更准确地匹配了项目指定的内容。

生成链接行时使用的此策略设置是在通过 add_executable 或 add_library 命令创建目标时生效的设置。对于上面描述的示例,代码

cmake_policy(SET CMP0003 OLD) # or cmake_policy(VERSION 2.4)
add_executable(myexe myexe.c)
target_link_libraries(myexe /path/to/libA.so B)

将起作用并抑制此策略的警告。也可以对其进行更新以使用更正后的链接方法

cmake_policy(SET CMP0003 NEW) # or cmake_policy(VERSION 2.6)
link_directories(/path/to) # needed to find library B
add_executable(myexe myexe.c)
target_link_libraries(myexe /path/to/libA.so B)

更好的是,可以使用完整路径指定库 B

add_executable(myexe myexe.c)
target_link_libraries(myexe /path/to/libA.so /path/to/libB.so)

当链接行上的所有项目都具有已知路径时,CMake 不会检查此策略,因此它不起作用。

请注意,此策略的警告最多只会为一个目标发出。这避免了在设置一次策略可能修复所有目标时,向用户发送大量针对每个目标的消息。

此策略在 CMake 2.6.0 版本中引入。在 CMake 4.0 版本中移除之前,可以通过 cmake_policy()cmake_minimum_required() 设置。如果未设置,CMake 会发出警告,并使用 OLD 行为。