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