我目前正在构建一个带有插件结构的项目。我正在使用CMake编译项目。这些插件在单独的目录中编译。我的问题是,CMake编译和保存二进制文件和插件,动态库,在源代码的目录结构。我如何让CMake保存文件在一个类似。/bin目录?
当前回答
再加上:
如果你正在使用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 )
其他回答
使用EXECUTABLE_OUTPUT_PATH CMake变量设置所需的路径。详细信息请参考CMake在线文档:
CMake 2.8.8文档
对serg06的答案的进一步细化:
要强制所有生成器和所有构建配置都使用这三个路径,您可以添加一个空生成器表达式,如下所示:
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循环。
cat CMakeLists.txt
project (hello)
set(CMAKE_BINARY_DIR "/bin")
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR})
add_executable (hello hello.c)
使用以下行配置:
集(EXECUTABLE_OUTPUT_PATH $ {PROJECT_SOURCE_DIR} /构建/) 放置任何CMakeLists.txt项目。
这个${PROJECT_SOURCE_DIR}是项目所在的当前源目录。 如果想知道为什么是${EXECUTABLE_OUTPUT_PATH},检查这个文件CMakeCache.txt,然后搜索关键字输出路径,所有变量都定义在这里,它会给出项目所有设置的完整解释。
正如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)。
推荐文章
- cplusplus.com给出的错误、误解或坏建议是什么?
- 找出质数最快的算法是什么?
- c++枚举类可以有方法吗?
- 格式化IO函数(*printf / *scanf)中的转换说明符%i和%d之间的区别是什么?
- 将析构函数设为私有有什么用?
- main()中的Return语句vs exit()
- 为什么c#不提供c++风格的'friend'关键字?
- 在函数的签名中添加关键字
- 我如何在Visual Studio中预处理后看到C/ c++源文件?
- 为什么在标准容器中使用std::auto_ptr<>是错误的?
- CMake无法找到OpenSSL库
- 用比较double和0
- 保护可执行文件不受逆向工程的影响?
- 在c++中字符串前面的“L”是什么意思?
- 为什么std::map被实现为红黑树?