我们使用CMake来生成SVN中源代码的Visual Studio文件。现在,我的工具要求一些DLL文件与可执行文件位于同一文件夹中。DLL文件位于源代码旁边的文件夹中。
如何更改我的CMakeLists.txt
,使生成的Visual Studio项目在发布/调试文件夹中已经具有特定的DLL文件,或者在编译时复制它们?
发布于 2012-05-20 18:44:43
我会和cmake -E copy_if_different...
一起使用add_custom_command
来实现这一点。要获取完整信息,请运行
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>)
如果您需要根据配置(发布、调试等)复制不同的/libs/Debug
,那么您可以在子目录中使用相应的配置命名这些dll:dll和dll。然后,需要将配置类型注入到add_custom_command
调用中的dll的路径中,如下所示:
add_custom_command(TARGET MyTest POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
"${PROJECT_SOURCE_DIR}/libs/$<CONFIGURATION>"
$<TARGET_FILE_DIR:MyTest>)
发布于 2015-12-24 07:21:23
我将这些行放在我的顶级CMakeLists.txt文件中。所有由CMake编译的库和可执行文件都将放在构建目录的顶层,以便可执行文件可以找到这些库,并且可以轻松地运行所有内容。
set (CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
请注意,这并没有解决OP从项目的源目录复制预编译二进制文件的问题。
发布于 2014-11-18 06:45:54
接受答案的附录,作为单独的答案添加,这样我就可以得到代码格式:
如果您在同一项目中构建dll,则它们通常位于Release、Debug等目录中。您必须使用Visual Studio环境变量来正确地复制它们。例如:
"${PROJECT_BINARY_DIR}/your_library/\$\(Configuration\)/your_library.dll"
对于源代码和
"${CMAKE_CURRENT_BINARY_DIR}/\$\(Configuration\)/your_library.dll"
对于目的地。注意转义!
您不能将CMake CMAKE_BUILD_TYPE变量用于配置,因为它是在VS项目生成时解析的,并且将始终是任何缺省值。
https://stackoverflow.com/questions/10671916
复制相似问题