CMake可执行文件位置

33

我有一个非常简单的目录结构:

Project
Project/src
Project/build

源代码位于Project/src,我进行的是Project/build的目录外构建,在运行 cmake ../ ; make之后,我可以这样运行可执行文件:Project/build$ src/Executable。也就是说,Executable将被创建在build/src目录中。

我该如何在CMakeLists.txt文件中设置可执行文件的位置?我尝试了一些在cmake.org找到的示例,但有效的链接似乎没有展示这种情况。

我的Project/src/CMakeLists.txt文件在此处列出。


include_directories(${SBSProject_SOURCE_DIR}/src)
link_directories(${SBSProject_BINARY_DIR}/src)

set ( SBSProject_SOURCES
    main.cpp
    )

add_executable( TIOBlobs ${SBSProject_SOURCES})

顶层的Project/CMakeLists.txt:


cmake_minimum_required (VERSION 2.6)
project (SBSProject)

set (CMAKE_CXX_FLAGS "-g3 -Wall -O0") 

add_subdirectory(src)
3个回答

40
你有几个选择。
要更改可执行文件的默认位置,请将 CMAKE_RUNTIME_OUTPUT_DIRECTORY 设置为所需位置。例如,如果你添加了:
set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})

如果在add_subdirectory命令之前向您的Project/CMakeLists.txt添加以下代码,则您的可执行文件将出现在Unix构建中的Project/build或Win32构建中的build/<config type>。有关详细信息,请运行:

cmake --help-property RUNTIME_OUTPUT_DIRECTORY

对于这样大小的项目,另一个选项是只有一个CMakeLists.txt文件。你可以将add_subdirectory(src)替换为Project/src/CMakeLists.txt中的内容,以实现相同的输出路径。

但是,还有一些其他问题。

通常情况下,您可能要避免使用link_directories。要了解其原因,请运行

cmake --help-command link_directories
即使您使用 link_directories,也不太可能在 ${SBSProject_BINARY_DIR}/src 中找到任何库。
另一个问题是 CMAKE_CXX_FLAGS 只适用于 Unix 构建,因此应该在 if (UNIX) ... endif() 块中进行包装。当然,如果您不打算在除 Unix 以外的任何系统上构建,则这不是问题。
最后,我建议将 CMake 的最低版本要求设为 2.8,除非必须使用 2.6 - CMake 是一个正在积极开发的项目,当前版本比 2.6 有许多重要的改进。
因此,Project/CMakeLists.txt 的单个替代方法可能如下所示:
cmake_minimum_required (VERSION 2.8)
project (SBSProject)

if (UNIX)
  set (CMAKE_CXX_FLAGS "-g3 -Wall -O0")
endif ()

include_directories (${SBSProject_SOURCE_DIR}/src)

set (SBSProject_SOURCES
    ${SBSProject_SOURCE_DIR}/src/main.cpp
    )

add_executable (TIOBlobs ${SBSProject_SOURCES})

10

通过 set(EXECUTABLE_OUTPUT_PATH 可执行程序所在目录的路径) 可以实现可执行文件的位置重定位。


新用户应使用"RUNTIME_OUTPUT_DIRECTORY",因为它取代了"EXECUTABLE_OUTPUT_PATH"。 - li ki

6

Win32构建的“配置类型”。

对于MSVC而言,为避免创建默认的“/Debug”文件夹。

set_target_properties(my_target
PROPERTIES 
RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_CURRENT_BINARY_DIR})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接