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 行为将添加链接器搜索路径,即使它们对其自身的库不需要。当此策略设为 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_policy()cmake_minimum_required() 进行设置。如果未设置,CMake 会发出警告,并使用 OLD 行为。

注意

一项策略的 OLD 行为 按定义已弃用,并且可能会在将来的 CMake 版本中移除。