【发布时间】:2011-09-29 12:04:27
【问题描述】:
我目前正在构建一个带有插件结构的项目。我正在使用 CMake 编译项目。插件在单独的目录中编译。我的问题是 CMake 将二进制文件和插件、动态库编译并保存在源的目录结构中。如何让 CMake 将文件保存在 ./bin 目录之类的目录中?
【问题讨论】:
我目前正在构建一个带有插件结构的项目。我正在使用 CMake 编译项目。插件在单独的目录中编译。我的问题是 CMake 将二进制文件和插件、动态库编译并保存在源的目录结构中。如何让 CMake 将文件保存在 ./bin 目录之类的目录中?
【问题讨论】:
正如 Oleg 的回答,我相信要设置的正确变量是 CMAKE_RUNTIME_OUTPUT_DIRECTORY。我们在根 CMakeLists.txt 中使用以下内容:
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
您还可以基于每个目标指定输出目录:
set_target_properties( targets...
PROPERTIES
ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
)
在这两种情况下,您都可以将_[CONFIG] 附加到变量/属性名称以使输出目录适用于特定配置(配置的标准值为DEBUG、RELEASE、MINSIZEREL 和RELWITHDEBINFO )。
【讨论】:
CMAKE_ARCHIVE_OUTPUT_DIRECTORY的目的是什么,考虑到命令install(TARGETS <target_name>)仍然抱怨“给定没有RUNTIME DESTINATION for executable target”?这个变量应该提供一个默认值,因此install 命令不应该抱怨缺少RUNTIME DESTINATION。
CMAKE_ARCHIVE_OUTPUT_DIRECTORY 设置静态(归档)库(Linux 上的 .a 文件)的构建位置。它不会影响install 放置文件的位置。
使用set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "/some/full/path/to/bin")
【讨论】:
使用EXECUTABLE_OUTPUT_PATH CMake 变量来设置所需的路径。详情请参考在线 CMake 文档:
【讨论】:
就我而言,我使用的是 cmake 3.5,以下 (set variable) 不起作用:
set(
ARCHIVE_OUTPUT_DIRECTORY "/home/xy/cmake_practice/lib/"
LIBRARY_OUTPUT_DIRECTORY "/home/xy/cmake_practice/lib/"
RUNTIME_OUTPUT_DIRECTORY "/home/xy/cmake_practice/bin/"
)
但这有效(set set_target_properties):
set_target_properties(demo5
PROPERTIES
ARCHIVE_OUTPUT_DIRECTORY "/home/xy/cmake_practice/lib/"
LIBRARY_OUTPUT_DIRECTORY "/home/xy/cmake_practice/lib/"
RUNTIME_OUTPUT_DIRECTORY "/home/xy/cmake_practice/bin/"
)
【讨论】:
$ cat CMakeLists.txt
project (hello)
set(EXECUTABLE_OUTPUT_PATH "bin")
add_executable (hello hello.c)
【讨论】:
英语不是我的母语;请原谅打字错误。
使用这一行配置:set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/build/)
放置您的任何 CMakeLists.txt 项目。
这个 ${PROJECT_SOURCE_DIR} 是您当前项目所在的源目录。
如果徘徊为什么是 ${EXECUTABLE_OUTPUT_PATH}
检查此文件CMakeCache.txt 然后搜索关键字output path,
这里定义的所有变量,它会给出项目的完整解释setting·
【讨论】:
补充:
如果您使用 CMAKE 生成 Visual Studio 解决方案,并且希望 Visual Studio 将编译后的文件输出到 /bin,则需要将 Peter 的答案修改为位:
# set output directories for all builds (Debug, Release, etc.)
foreach( OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES} )
string( TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG )
set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_SOURCE_DIR}/lib )
set( CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_SOURCE_DIR}/lib )
set( CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_SOURCE_DIR}/bin )
endforeach( OUTPUTCONFIG CMAKE_CONFIGURATION_TYPES )
【讨论】:
cat CMakeLists.txt
project (hello)
set(CMAKE_BINARY_DIR "/bin")
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR})
add_executable (hello hello.c)
【讨论】:
无论我是在主 CMakeLists.txt 中还是在单独的 CMakeLists.txt 中定义它,它仍然假设我希望所有库和 bin 离开主路径,这是所有假设中最没用的假设。
【讨论】: