正如 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
)。
使用set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "/some/full/path/to/bin")
使用 EXECUTABLE_OUTPUT_PATH
CMake 变量设置所需的路径。有关详细信息,请参阅在线 CMake 文档:
$ cat CMakeLists.txt
project (hello)
set(EXECUTABLE_OUTPUT_PATH "bin")
add_executable (hello hello.c)
至于我,我使用的是 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/"
)
使用此行配置:
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/build/)
放置您的任何 CMakeLists.txt 项目。
这个 ${PROJECT_SOURCE_DIR}
是您当前项目所在的源目录。
如果徘徊为什么 ${EXECUTABLE_OUTPUT_PATH}
检查这个文件 CMakeCache.txt
然后搜索关键字 output path
,所有变量都在这里定义,它会给出一个完整的项目所有设置的解释。
要补充这一点:
如果您使用 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 离开主路径,这是所有假设中最没用的假设。
对 serg06's answer 的另一项改进:
要强制三个路径按原样用于所有生成器和所有构建配置,您可以添加一个空的生成器表达式,如下所示:
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "$<0:>${CMAKE_BINARY_DIR}/bin") # .exe and .dll
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "$<0:>${CMAKE_BINARY_DIR}/lib") # .so and .dylib
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "$<0:>${CMAKE_BINARY_DIR}/lib") # .lib and .a
这具有强制 Visual Studio 生成器特别按原样使用指定路径的副作用,而不是附加特定于配置的子目录,而无需 foreach
循环。
不定期副业成功案例分享
install(TARGETS <target_name>)
仍然抱怨“没有为可执行目标指定 RUNTIME DESTINATION”,设置CMAKE_ARCHIVE_OUTPUT_DIRECTORY
的目的是什么?这个变量应该提供一个默认值,因此install
命令不应抱怨缺少RUNTIME DESTINATION
。CMAKE_ARCHIVE_OUTPUT_DIRECTORY
设置静态(归档)库(Linux 上的 .a 文件)的构建位置。它不会影响install
放置文件的位置。