Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用CMake将与生成相关的DLL复制到工作目录_Dll_Cmake - Fatal编程技术网

使用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上工作,但我想它几乎是一样的,因为真正的问题来自于有多个配置:ReleaseDebugRelease\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的情况并非如此。 此外,每个图书馆似乎都有自己的行为方式。我应该如何以编程方式实现这一点(也适用于我的项目中可能包含的其他第三方库)? 提前谢谢