2017-09-22 31 views
1

我的理解是CMAKE_CURRENT_BINARY_DIR應該指向當前CMakeLists.txt文件的二進制文件所在的目錄。但是,這似乎並非如此。爲什麼不把二進制文件放在CMAKE_CURRENT_BINARY_DIR中?

考慮這個文件結構:

CMakeTest 
+- CMakeLists.txt 
+- main.cpp 

的CMakeLists.txt

cmake_minimum_required(VERSION 3.2) 
add_executable(CMakeTest main.cpp) 
message(STATUS "CMAKE_CURRENT_BINARY_DIR = ${CMAKE_CURRENT_BINARY_DIR}") 

的main.cpp

#include <iostream> 

int main() { 
    std::cout << "Hello, World!"; 
    return 0; 
} 

在(Windows)中的命令行,我跑下列 命令:

md build 
cd build 
cmake .. -G "Visual Studio 14 2015" 
cmake --build . 

第一cmake命令打印(除其他事項外)行

CMAKE_CURRENT_BINARY_DIR = X是:/ dev /項目/ CMakeTest /建造

所以我期望由此產生的二進制文件CMakeTest.exe在那裏結束。實際上,它放置在X:/ dev/projects/CMakeTest/build/Debug中。

爲什麼不是將二進制文件放入CMAKE_CURRENT_BINARY_DIR,而是放在一個子目錄中?是否有任何CMake變量告訴我該子目錄是什麼?

編輯:

我並不想改變其中二進制文件放置的目錄。我試圖確定吧。原因是這樣的:

在構建期間,會在與可執行文件相同的目錄中創建許多其他資源文件。 (這部分工作。)我想使用install(FILES, ...)命令然後將這些文件添加到生成的包。所以我需要將二進制文件的實際路徑傳遞到install(FILES, ...)

+0

我想這是MSVC發生器的一個缺點。 – arrowd

+0

我相信這是一件好事..我的意思是調試和釋放可執行文件不兼容,並且可能將其命名爲最好將它們保存在單獨的文件夾中。請記住,MSVC默認有4種配置。 – drescherjm

+0

@arrowd:它似乎不是一個生成器問題。在OS X上使用'Xcode'生成器具有相同的結果。 –

回答

1

變量CMAKE_CURRENT_BINARY_DIR表示CMake的「目前正在處理的二進制目錄」。通常,此目錄及其子目錄包含構建工件,如可執行文件,庫或其他生成的文件。

如果要控制正在構建的可執行文件的位置,則需要設置變量CMAKE_RUNTIME_OUTPUT_DIRECTORY

注意,那多配置構建工具,如Visual Studio,對於每一個特定的配置將創建子目錄下CMAKE_RUNTIME_OUTPUT_DIRECTORY(命名爲配置本身)。否則,爲不同配置創建的可執行文件將自行覆蓋。

對於精確控制用於構建可執行文件的每個配置目錄,使用變量CMAKE_RUNTIME_OUTPUT_DIRECTORY_<CONFIG>。 (代替< CONFIG應插入>具體結構的名稱,因此CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG變量會影響調試構建)。


對於剛剛確定與可執行文件的目錄,使用$<TARGET_FILE_DIR:tgt>generator expression(而不是tgt目標的名稱創建可執行文件應使用)。

請注意,生成器表達式只能在特定位置使用。例如,install(FILES)命令的文件列表可以使用發生器表達式,但message()命令不能。

+0

感謝您的解釋,@Tsyvarev。恐怕我不清楚自己想要達到的目標。我在我的問題中添加了「編輯:」段落。如果你能看一看就太棒了! –

+0

看起來您正在尋找'$ '生成器表達式,請參閱編輯答案。 – Tsyvarev

相關問題