CMP0003¶
警告
此策略的 OLD 行为已在 CMake 4.0 版本中移除。此策略必须通过调用 cmake_minimum_required() 或 cmake_policy() 来设置为 NEW。
通过完整路径链接的库不再产生链接器搜索路径。
此策略会影响在链接时如何查找(当其完整路径未知时)库,但其创建源于 CMake 处理已知完整路径库的方式的更改。考虑以下代码:
target_link_libraries(myexe /path/to/libA.so)
CMake 2.4 及更早版本通过将链接库的完整路径分割成单独的组件(链接器搜索路径和库名)来实现链接。示parse 代码可能会产生类似如下的内容:
... -L/path/to -lA ...
以链接到库 A。曾执行过分析来排序多个链接目录,以使链接器能在期望的位置找到库 A,但这种情况并非总能奏效。CMake 2.6 及更高版本在大多数情况下使用更可靠的方法,直接将库的完整路径传递给链接器。示parse 代码现在会产生类似如下的内容:
... /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 命令创建目标时生效的。对于上面描述的示parse,以下代码:
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 行为。