我正在使用 cmake 来管理我的跨平台构建,除了这个问题之外,我已经解决了所有问题。我将
RUNTIME_OUTPUT_DIRECTORY
设置为存储数据文件的 bin/
目录。在 Linux 上,这工作得很好。在 Windows 上,根据构建类型,可执行文件被放置在 Debug
/Release
子目录中。有什么方法可以让 cmake 将可执行文件复制到正确的目录,或者(甚至更好)完全停止使用这些子目录?
多年来我一直在使用 Ogapo 报告的精细前缀属性 hack。它有效。
但从 CMake 2.8 版本开始,官方支持避免在 Windows 上使用 Release/Debug 子目录。
使用全局
CMAKE_<ARTIFACT>_OUTPUT_DIRECTORY_<CONFIGURATION>
变量,或每个目标 <ARTIFACT>_OUTPUT_DIRECTORY_<CONFIGURATION>
属性,如下所示:
SET( CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG "${OUTPUT_DIRECTORY}")
SET( CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE "${OUTPUT_DIRECTORY}")
SET( CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG "${OUTPUT_DIRECTORY}")
SET( CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE "${OUTPUT_DIRECTORY}")
SET( CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG "${OUTPUT_DIRECTORY}")
SET( CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE "${OUTPUT_DIRECTORY}")
我不确定这些目录是故意的还是错误,但冒着向前不兼容的风险,您可以添加:
if (MSVC_IDE)
# hack to get around the "Debug" and "Release" directories cmake tries to add on Windows
set_target_properties (${NAME} PROPERTIES PREFIX "../")
endif()
这对我很有用
我发现了一些关于这个主题的很好的讨论:
http://www.cmake.org/pipermail/cmake/2008-April/021355.html
http://www.vtk.org/Bug/bug_view_advanced_page.php?bug_id=8366
是否可以使用已弃用的 EXECUTABLE_OUTPUT_PATH 代替 RUNTIME_OUTPUT_DIRECTORY?我不确定两者之间的功能发生了哪些变化,但可能值得一试。
一些 cmake 变量具有构建特定版本。
CMAKE_C_FLAGS
the compiler flags for compiling C sources. Note you can also specify switches with ADD_DEFINITIONS().
CMAKE_C_FLAGS_DEBUG
compiler flags for compiling a debug build from C sources.
CMAKE_C_FLAGS_RELEASE
compiler flags for compiling a release build from C sources.
CMAKE_C_FLAGS_RELWITHDEBINFO
compiler flags for compiling a release build with debug flags from C sources.
我尚未验证这些变量是否存在,但也许将
RUNTIME_OUTPUT_DIRECTORY_DEBUG
&& RUNTIME_OUTPUT_DIRECTORY_RELEASE
设置为相同的值可能会起作用。
到目前为止,我找到的最佳答案是简单地为每个目标和数据文件编写 CMake 安装命令,并将 MSVC 调试器设置为在安装目录之外运行。这具有使用 CPack 创建安装程序的额外好处。
对我来说是全球性的:
set(CMAKE_STATIC_LIBRARY_PREFIX "../lib")
set(CMAKE_SHARED_LIBRARY_PREFIX "../lib")
完成了工作,所以我不必为每个库设置它(CMake 2.8.4)
现在有一个简单的解决方案。 cmake 说:
多配置生成器(Visual Studio、Xcode、Ninja Multi-Config)将每个配置的子目录附加到指定的 目录,除非使用生成器表达式。
所以我们可以使用生成器表达式。像下面这样:
set_target_properties(foo PROPERTIES ARCHIVE_OUTPUT_DIRECTORY $<1:${PROJECT_SOURCE_DIR}/lib>)
set_target_properties(foo PROPERTIES LIBRARY_OUTPUT_DIRECTORY $<1:${PROJECT_SOURCE_DIR}/lib>)
set_target_properties(foo PROPERTIES RUNTIME_OUTPUT_DIRECTORY $<1:${PROJECT_SOURCE_DIR}/bin>)
如果你想放入配置目录,请使用这个:
set_target_properties(foo PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/output/$<CONFIG>/lib)
set_target_properties(foo PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/output/$<CONFIG>/lib)
set_target_properties(foo PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/output/$<CONFIG>/bin)
hgyxbll 的答案在全球范围内为我工作(针对所有目标)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY $<1:${PROJECT_SOURCE_DIR}/bin>)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY $<1:${PROJECT_SOURCE_DIR}/bin>)
您需要更改 Visual Studio 项目的构建位置。转到“项目属性”,然后在“编译”选项卡上将“构建输出路径”指定为您希望的任何位置。
注意
不知道这有多相关,因为我不了解 CMake。
您可以在 Visual Studio 构建事件中使用以下令牌:
$(TargetPath)
这将是您的项目构建位置的路径,因此根据您的项目设置,这将是“调试”或“发布”文件夹。