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 行为。