CMP0003

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

此策略会影响在链接时如何找到其完整路径未知的库,但由于 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 时,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 版本 |发布|当未设置策略并使用“旧”行为时发出警告。使用 cmake_policy() 命令将其显式设置为 OLDNEW

备注

策略的“旧”行为是 :manual:根据定义 <cmake-policies(7)> 已弃用,并且可能会在未来版本的 CMake 中删除。