使用CMake将与生成相关的DLL复制到工作目录
所以,我已经在互联网上搜索了一段时间,我仍然需要找到一个令人满意的解决方案:使用CMake将与生成相关的DLL复制到工作目录,dll,cmake,Dll,Cmake,所以,我已经在互联网上搜索了一段时间,我仍然需要找到一个令人满意的解决方案: set_target_properties(pthread PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${EXTERNAL_DIR}/pthread/include" IMPORTED_IMPLIB_RELEASE "${EXTERNAL_DIR}/pthread/lib/pthreadVC3.lib" IMPORTED_IMPLIB_DEBUG "${
set_target_properties(pthread PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${EXTERNAL_DIR}/pthread/include"
IMPORTED_IMPLIB_RELEASE "${EXTERNAL_DIR}/pthread/lib/pthreadVC3.lib"
IMPORTED_IMPLIB_DEBUG "${EXTERNAL_DIR}/pthread/lib/pthreadVC3d.lib"
IMPORTED_LOCATION_RELEASE "${EXTERNAL_DIR}/pthread/bin/pthreadVC3.dll"
IMPORTED_LOCATION_DEBUG "${EXTERNAL_DIR}/pthread/bin/pthreadVC3d.dll"
MAP_IMPORTED_CONFIG_RELEASE_DEBUG Release)
get_target_property(PTHREAD_LOCATION pthread LOCATION)
message("pthread: ${PTHREAD_LOCATION}")
get_target_property(OPENSSL_LOCATION OpenSSL::SSL LOCATION)
message("openssl: ${OPENSSL_LOCATION}")
get_target_property(QT_LOCATION Qt4::QtCore LOCATION)
message("qt: ${QT_LOCATION}")
pthread: D:/workspace/ewas_win_2015/externals/pthread/bin/pthreadVC3.dll
openssl: D:/workspace/ewas_win_2015/externals/openssl/lib/libssl.lib
qt: D:/local/qt/qt-4.8.7/lib/QtCore4.lib
我在Windows上有一个CMake项目(实际上,它也应该在Linux上工作,但我想它几乎是一样的,因为真正的问题来自于有多个配置:Release、Debug和Release\u Debug)
我使用了几个第三方库,还有其他库(只是举个例子):pthread、openssl和qt。
Qt和openssl的配置脚本与CMake捆绑在一起,对于pthread,我已使用以下内容创建了一个导入的目标:
set_target_properties(pthread PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${EXTERNAL_DIR}/pthread/include"
IMPORTED_IMPLIB_RELEASE "${EXTERNAL_DIR}/pthread/lib/pthreadVC3.lib"
IMPORTED_IMPLIB_DEBUG "${EXTERNAL_DIR}/pthread/lib/pthreadVC3d.lib"
IMPORTED_LOCATION_RELEASE "${EXTERNAL_DIR}/pthread/bin/pthreadVC3.dll"
IMPORTED_LOCATION_DEBUG "${EXTERNAL_DIR}/pthread/bin/pthreadVC3d.dll"
MAP_IMPORTED_CONFIG_RELEASE_DEBUG Release)
get_target_property(PTHREAD_LOCATION pthread LOCATION)
message("pthread: ${PTHREAD_LOCATION}")
get_target_property(OPENSSL_LOCATION OpenSSL::SSL LOCATION)
message("openssl: ${OPENSSL_LOCATION}")
get_target_property(QT_LOCATION Qt4::QtCore LOCATION)
message("qt: ${QT_LOCATION}")
pthread: D:/workspace/ewas_win_2015/externals/pthread/bin/pthreadVC3.dll
openssl: D:/workspace/ewas_win_2015/externals/openssl/lib/libssl.lib
qt: D:/local/qt/qt-4.8.7/lib/QtCore4.lib
一切编译和链接都很好,但是当运行应用程序时,我需要将DLL复制到我的工作目录中。
目前,我是这样做的:
get_filename_component(QT_DLL_DIR ${QT_QMAKE_EXECUTABLE} DIRECTORY)
set(THIRD_PARTY_BINARIES
"${EXTERNAL_DIR}/pthread/bin/pthreadVC3$<$<CONFIG:Debug>:d>.dll"
"${EXTERNAL_DIR}/openssl/bin/libcrypto-1_1-x64.dll"
"${EXTERNAL_DIR}/openssl/bin/libssl-1_1-x64.dll"
"${QT_DLL_DIR}/QtCore$<$<CONFIG:Debug>:d>${QT_VERSION_MAJOR}.dll"
"${QT_DLL_DIR}/QtGui$<$<CONFIG:Debug>:d>${QT_VERSION_MAJOR}.dll")
foreach(BINARY ${THIRD_PARTY_BINARIES})
add_custom_command(TARGET MyApp POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different "$<SHELL_PATH:${BINARY}>" "$<SHELL_PATH:${OUTPUT_DIR}/$<CONFIG>>")
endforeach()
并得到以下输出:
pthread: pthread-NOTFOUND
openssl: D:/workspace/ewas_win_2015/externals/openssl/lib/libssl.lib
qt: D:/local/qt/qt-4.8.7/lib/QtCore4.lib
我在LOCATION_RELEASE中尝试了相同的方法,得到了以下结果:
set_target_properties(pthread PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${EXTERNAL_DIR}/pthread/include"
IMPORTED_IMPLIB_RELEASE "${EXTERNAL_DIR}/pthread/lib/pthreadVC3.lib"
IMPORTED_IMPLIB_DEBUG "${EXTERNAL_DIR}/pthread/lib/pthreadVC3d.lib"
IMPORTED_LOCATION_RELEASE "${EXTERNAL_DIR}/pthread/bin/pthreadVC3.dll"
IMPORTED_LOCATION_DEBUG "${EXTERNAL_DIR}/pthread/bin/pthreadVC3d.dll"
MAP_IMPORTED_CONFIG_RELEASE_DEBUG Release)
get_target_property(PTHREAD_LOCATION pthread LOCATION)
message("pthread: ${PTHREAD_LOCATION}")
get_target_property(OPENSSL_LOCATION OpenSSL::SSL LOCATION)
message("openssl: ${OPENSSL_LOCATION}")
get_target_property(QT_LOCATION Qt4::QtCore LOCATION)
message("qt: ${QT_LOCATION}")
pthread: D:/workspace/ewas_win_2015/externals/pthread/bin/pthreadVC3.dll
openssl: D:/workspace/ewas_win_2015/externals/openssl/lib/libssl.lib
qt: D:/local/qt/qt-4.8.7/lib/QtCore4.lib
并使用位置_调试:
pthread: D:/workspace/ewas_win_2015/externals/pthread/bin/pthreadVC3d.dll
openssl: D:/workspace/ewas_win_2015/externals/openssl/lib/libssl.lib
qt: D:/local/qt/qt-4.8.7/lib/QtCored4.lib
pthread: D:/workspace/ewas_win_2015/externals/pthread/bin/pthreadVC3d.dll
openssl: OPENSSL_LOCATION-NOTFOUND
qt: D:/local/qt/qt-4.8.7/lib/QtCored4.lib
然后我切换到导入的位置:
pthread: PTHREAD_LOCATION-NOTFOUND
openssl: D:/workspace/ewas_win_2015/externals/openssl/lib/libssl.lib
qt: QT_LOCATION-NOTFOUND
和导入的位置发布:
pthread: D:/workspace/ewas_win_2015/externals/pthread/bin/pthreadVC3.dll
openssl: D:/workspace/ewas_win_2015/externals/openssl/lib/libssl.lib
qt: D:/local/qt/qt-4.8.7/lib/QtCore4.lib
最后到导入的\u位置\u调试:
pthread: D:/workspace/ewas_win_2015/externals/pthread/bin/pthreadVC3d.dll
openssl: D:/workspace/ewas_win_2015/externals/openssl/lib/libssl.lib
qt: D:/local/qt/qt-4.8.7/lib/QtCored4.lib
pthread: D:/workspace/ewas_win_2015/externals/pthread/bin/pthreadVC3d.dll
openssl: OPENSSL_LOCATION-NOTFOUND
qt: D:/local/qt/qt-4.8.7/lib/QtCored4.lib
我在某个地方读到,dll路径应该位于LOCATION(或IMPORTED_LOCATION)属性中,但显然openssl和qt的情况并非如此。
此外,每个图书馆似乎都有自己的行为方式。我应该如何以编程方式实现这一点(也适用于我的项目中可能包含的其他第三方库)?
提前谢谢