最近用cmake構建QT工程,做了一些小實驗,期間遇到了這個問題,記錄一下。
網上看到遇到這個問題的人,問題都各有不同,我這邊遇到的問題是這樣的,我想要在CMake中將導入的第三方庫複製到生成的可執行文件的bin目錄下,於是寫了下面一段代碼:
#將依賴庫複製到目標文件夾
add_custom_command(TARGET yxwidgets PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
${CMAKE_SOURCE_DIR}/lib/liteavSdk/lib
${bin_dir}/${CMAKE_BUILD_TYPE}
)
這個代碼本身沒啥語法問題,但是我搞錯了一個比較重要的點,那就是CMAKE_SOURCE_DIR與CMAKE_CURRENT_SOURCE_DIR這兩個參數雖然有時候用起來效果是一樣的(工程沒有子項目的情況下),但是實際作用卻並不相同,下面看看官方文檔的解釋:
CMAKE_SOURCE_DIR:
The path to the top level of the source tree.
當前工程目錄的頂層路徑
CMAKE_CURRENT_SOURCE_DIR:
The path to the source directory currently being processed.
This the full path to the source directory that is currently being processed by cmake.
當前正在處理的源目錄的路徑。
這是cmake當前正在處理的源目錄的完整路徑。
CMAKE_SOURCE_DIR即當前工程目錄的最頂層的路徑,因爲我們在構建工程的時候經常會嵌套工程,所以這個變量表示爲當前工程最頂層目錄中的文件夾。
CMAKE_CURRENT_SOURCE_DIR即當前正在處理的工程目錄的路徑,舉個栗子:如果你的項目中有一個工程項目A,當中包含子項目B,那麼CMAKE_SOURCE_DIR表示的是項目A在操作系統的路徑,而CMAKE_CURRENT_SOURCE_DIR表示的是子項目B的路徑。
我犯的錯誤是錯將CMAKE_SOURCE_DIR當做CMAKE_CURRENT_SOURCE_DIR來使用,結果就是cmake找不到我想要copy的路徑,於是報了這個錯誤,所以建議看到這個錯誤的同學可以檢查一下自己的cmake文件是否編寫錯誤。
改正之後的代碼:
#將依賴庫複製到目標文件夾
add_custom_command(TARGET yxwidgets PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
${CMAKE_CURRENT_SOURCE_DIR}/lib/liteavSdk/lib
${bin_dir}/${CMAKE_BUILD_TYPE}
)
一句話總結,我的這個錯誤是由於CmakeList.txt編寫的庫文件目錄錯誤引起的。
補充:
第二次出現這個問題,是因爲程序崩潰了,我用visual studio打開了dump文件,並開啓了調試,但是vs一直沒有關閉,就去點擊運行qt,於是再次出現了這個報錯,只要將vs關閉調試或者直接將vs關閉就可以了。