cmake:用add_subdirectory()添加外部項目文件夾


一般情況下,我們的項目各個子項目都在一個總的項目根目錄下,但有的時候,我們需要使用外部的文件夾,怎么辦呢? 
add_subdirectory命令,可以將指定的文件夾加到build任務列表中。下面是將與當前項目平級的一個目錄下的子目錄用add_subdirectory命令加進來的CMakelists.txt腳本片段 :

#定義CASSDK位置 if(NOT CASSDK_DIR) set( CASSDK_DIR ${CMAKE_SOURCE_DIR}/../cassdk) endif() if( IS_DIRECTORY ${CASSDK_DIR} ) add_subdirectory( ${CASSDK_DIR}/cassdk ) else() message(FATAL_ERROR "INVALID FOLDER 'CASSDK_DIR'=${CASSDK_DIR}" ) endif()

 

然后執行CMakeList.txt腳本時報錯了:

CMake Error at CMakeLists.txt:35 (add_subdirectory): 
add_subdirectory not given a binary directory but the given source 
directory “J:/workspace/cassdk/cassdk” is not a subdirectory of 
“J:/workspace/codemgr”. When specifying an out-of-tree source a binary 
directory must be explicitly specified.

報錯原因也很明確,因為要添加的這個文件夾不是當前項目的子目錄。最后一句指明了方向:要指定一個外部的文件夾必須顯式指定。 
但怎么顯式指定? 
下面是add_subdirectory命令的官方說明:

這里寫圖片描述

原來add_subdirectory還有一個 binary_dir參數(一般這個參數用不到,所以從來沒關注過),這個參數用來指定source_dir在輸出文件夾中的位置,如果沒有指定的時候,就用source_dir的值。 
如果要添加外部文件夾,binary_dir就必須指定。所以上面的代碼修改如下:

#定義CASSDK位置 if(NOT CASSDK_DIR) set( CASSDK_DIR ${CMAKE_SOURCE_DIR}/../cassdk) endif() if( IS_DIRECTORY ${CASSDK_DIR} ) # 第二個cassdk.out參數用於指定外部文件夾在輸出文件夾中的位置 add_subdirectory( ${CASSDK_DIR}/cassdk cassdk.out) else() message(FATAL_ERROR "INVALID FOLDER 'CASSDK_DIR'=${CASSDK_DIR}" ) endif()

 

再執行CMakeList.txt正常通過,下圖紅框標出就是cassdk子目錄下CMakeLists.txt的執行輸出。 
這里寫圖片描述

然后你可以發現在輸出文件夾下多出一個名為cassdk.out的文件夾,就是第二個參數指定的值。 
這里寫圖片描述

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM