霸气的弓箭 · c# 等待thread结束-掘金· 10 月前 · |
失落的饭卡 · FFmpeg入门详解之124:Qt5 ...· 1 年前 · |
讲道义的茶叶 · linux下find命令-atime,-ct ...· 1 年前 · |
豪情万千的牛肉面 · ECharts设置X轴axisLabel自适 ...· 1 年前 · |
我们使用CMake来生成SVN中源代码的Visual Studio文件。现在,我的工具要求一些DLL文件与可执行文件位于同一文件夹中。DLL文件位于源代码旁边的文件夹中。
如何更改我的
CMakeLists.txt
,使生成的Visual Studio项目在发布/调试文件夹中已经具有特定的DLL文件,或者在编译时复制它们?
您可能需要 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`
我会和
cmake -E copy_if_different...
一起使用
add_custom_command
来实现这一点。要获取完整信息,请运行
cmake --help-command add_custom_command
cmake -E
因此,在您的示例中,如果您具有以下目录结构:
/CMakeLists.txt
/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>)
接受答案的附录,作为单独的答案添加,这样我就可以得到代码格式:
如果您在同一项目中构建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项目生成时解析的,并且将始终是任何缺省值。
这对他们中的一个很有用
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)
我将这些行放在我的顶级CMakeLists.txt文件中。所有由CMake编译的库和可执行文件都将放在构建目录的顶层,以便可执行文件可以找到这些库,并且可以轻松地运行所有内容。
set (CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
请注意,这并没有解决OP从项目的源目录复制预编译二进制文件的问题。
您还可以使用命令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})
我是一个CMake初学者,但我仍然想分享我的经验。在我的例子中,我需要一个安装后的副本,以便我所有的二进制文件都在其中。对于可以在CMake中导入的第三方二进制文件,以下内容适用于我:
find_package( dependency REQUIRED )
if( MSVC )
# If done properly and if the dependency has a correct config file, IMPORTED_LOCATION_RELEASE should be defined
get_target_property( DEP_SHARED_LIB_PATH dependency IMPORTED_LOCATION_RELEASE )
# Create a bin directory in the install folder
add_custom_command(TARGET BGS POST_BUILD COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_INSTALL_PREFIX}/bin/)
# Copy the shared lib file
add_custom_command(TARGET BGS POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${DEP_SHARED_LIB_PATH} ${CMAKE_INSTALL_PREFIX}/bin/)
endif()
显然,根据共享库的构建/安装方式,IMPORTED_LOCATION_RELEASE可以有不同的版本。可能是IMPORTED_LOCATION_DEBUG。
也许有更好的方法来获得这个属性名称,我不知道。
当前评分最高的答案中的以下命令取决于/libs/中的输出。
add_custom_command(TARGET MyTest POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
"${PROJECT_SOURCE_DIR}/libs/$<CONFIGURATION>"
$<TARGET_FILE_DIR:MyTest>)
我使用下面的命令进行复制,它在任何地方都适用于我。请注意,我在这里只复制输出dll,而不是整个目录。还要注意,我正在硬编码一个特定于该项目的目标/bin/目录。但我想分享一下
$<TARGET_FILE_DIR:${CMAKE_PROJECT_NAME}>/$<TARGET_FILE_NAME:${CMAKE_PROJECT_NAME}>
语法,我认为它很简洁:
add_custom_command(TARGET ${CMAKE_PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
$<TARGET_FILE_DIR:${CMAKE_PROJECT_NAME}>/$<TARGET_FILE_NAME:${CMAKE_PROJECT_NAME}>
${CMAKE_CURRENT_SOURCE_DIR}/bin/$<TARGET_FILE_NAME:${CMAKE_PROJECT_NAME}>)
霸气的弓箭 · c# 等待thread结束-掘金 10 月前 |