我们使用CMake的为我们SVN生成我们的消息来源Visual Studio的文件。 现在我的工具需要一些DLL文件是在同一文件夹中的可执行文件。 该DLL文件是旁边的源文件夹中。
我怎样才能改变我CMakeLists.txt
使得生成的Visual Studio项目要么已经在发行/调试文件夹中的特定DLL文件或将它们复制在编译时?
我们使用CMake的为我们SVN生成我们的消息来源Visual Studio的文件。 现在我的工具需要一些DLL文件是在同一文件夹中的可执行文件。 该DLL文件是旁边的源文件夹中。
我怎样才能改变我CMakeLists.txt
使得生成的Visual Studio项目要么已经在发行/调试文件夹中的特定DLL文件或将它们复制在编译时?
我会用add_custom_command
来一起实现这一目标cmake -E copy_if_different...
。 对于全信息运行
cmake --help-command add_custom_command
cmake -E
所以你的情况,如果你有以下目录结构:
/CMakeLists.txt
/src
/libs/test.dll
和该命令适用于您的CMake的目标是MyTest
,那么你可以添加以下到您的CMakeLists.txt:
add_custom_command(TARGET MyTest POST_BUILD # Adds a post-build event to MyTest
COMMAND ${CMAKE_COMMAND} -E copy_if_different # which executes "cmake - E copy_if_different..."
"${PROJECT_SOURCE_DIR}/libs/test.dll" # <--this is in-file
$<TARGET_FILE_DIR:MyTest>) # <--this is out-file path
如果你只是想的全部内容/libs/
复制目录,使用cmake -E copy_directory
:
add_custom_command(TARGET MyTest POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
"${PROJECT_SOURCE_DIR}/libs"
$<TARGET_FILE_DIR:MyTest>)
如果您需要复制根据配置(发布,调试,如)不同的dll文件,那么你可以与相应的配置命名的子目录有这些/libs/Release
,和/libs/Debug
。 然后,您需要配置类型到路径注入到在该dll add_custom_command
调用,就像这样:
add_custom_command(TARGET MyTest POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
"${PROJECT_SOURCE_DIR}/libs/$<CONFIGURATION>"
$<TARGET_FILE_DIR:MyTest>)
我把这些线在我的顶层的CMakeLists.txt文件。 通过CMake的编译所有的库和可执行文件将被放置在构建目录的顶层,这样的可执行文件可以找到库和很容易运行一切。
set (CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
需要注意的是这并没有解决从项目的源代码目录复制预编译的二进制的OP的问题。
以接受的答案增编,添加作为一个单独的答案,所以我得到的代码格式:
如果您正在构建在同一项目中您的dll,他们通常会在发行,调试等目录。 你将不得不使用Visual Studio环境变量来正确地复制它们。 例如:
"${PROJECT_BINARY_DIR}/your_library/\$\(Configuration\)/your_library.dll"
源和
"${CMAKE_CURRENT_BINARY_DIR}/\$\(Configuration\)/your_library.dll"
为目的地。 注意逃逸!
你不能使用CMake的CMAKE_BUILD_TYPE变量的配置,因为它是在VS的项目生成时间解决,将永远是不管默认为。
这对他们的一个非常有用
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)
你可能需要添加自定义目标并使其依赖于你的可执行目标之一。 要使用上述功能,使用复制文件
COMMAND ${CMAKE_PROGRAM} -E copy_if_different ${CMAKE_BINARY_DIR}/path/to/file.dll ${CMAKE_BINARY_DIR}/where/to/put/file.dll
。
您也可以使用命令find_library:
find_library(<some_var> NAMES <name_of_lib> PATHS "<path/to/lib>")
随着定义EXECUTABLE_PATH,例如:
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
你可以移动.dll文件可执行文件的需要,同
file(COPY ${<some_var>}
DESTINATION ${EXECUTABLE_OUTPUT_PATH})