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 中移除。