SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY
${PROJECT_SOURCE_DIR}/lib CACHE
PATH "Directory where all the .lib files are dumped." FORCE)
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY
${PROJECT_SOURCE_DIR}/bin CACHE
PATH "Directory where .exe and .dll files are dumped." FORCE)
6 回答
我将使用
add_custom_command
与cmake -E copy_if_different...
一起实现此目的 . 完整信息运行所以在你的情况下,如果你有以下目录结构:
以及该命令适用的CMake目标是
MyTest
,然后您可以将以下内容添加到CMakeLists.txt:如果您只想复制
/libs/
目录的全部内容,请使用cmake -E copy_directory
:如果您需要根据配置(Release,Debug等)复制不同的dll,那么您可以使用相应的配置命名子目录:
/libs/Release
和/libs/Debug
. 然后,您需要将配置类型注入add_custom_command
调用中的dll路径,如下所示:我把这些行放在我的顶级CMakeLists.txt文件中 . 由CMake编译的所有库和可执行文件都将放置在构建目录的顶层,以便可执行文件可以找到库并且很容易运行所有内容 .
请注意,这并不能解决OP从项目源目录复制预编译二进制文件的问题 .
接受答案的附录,作为单独的答案添加,以便我获得代码格式:
如果要在同一个项目中构建dll,它们通常位于Release,Debug等目录中 . 您必须使用Visual Studio环境变量来正确复制它们 . 例如 . :
对于来源和
为目的地 . 注意逃跑!
您不能将CMake CMAKE_BUILD_TYPE变量用于配置,因为它在VS项目生成时解析,并且始终是默认值 .
这对其中一个很有用
您可能需要add custom target并使其依赖于您的一个可执行目标 . 使用上面的功能复制文件使用
COMMAND ${CMAKE_PROGRAM} -E copy_if_different ${CMAKE_BINARY_DIR}/path/to/file.dll ${CMAKE_BINARY_DIR}/where/to/put/file.dll
.您还可以使用命令find_library:
使用定义的EXECUTABLE_PATH,例如:
您可以移动您的可执行文件所需的.dll文件