微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何最好的告诉CMake在哪里可以findDLL

我有一个简单的项目结构派生自神奇的教程

https://rix0r.nl/blog/2015/08/13/cmake-guide/

它看起来如下:

- src - CMakeLists.txt - mylib - include/mylib/mylibclass.h - src/mylibclass.cpp - CMakeLists.txt - myapp - src/myapp.cpp - CMakeLists.txt

顶级CMakeLists.txt包含:

如何使用C ++在Windows中获取硬件信息?

如何将图标分配给Windows(或Visual Studio)上的可执行文件

如何在C ++中添加库?

Visual Studio和Linux下的gcc之间的C ++兼容性

为VS命令行编译器设置正确的path

cmake_minimum_required( VERSION 3.6 ) project( sample_project VERSION 0.1 LANGUAGES CXX ) set( BUILD_SHARED_LIBS ON CACHE BOOL "" ) add_subdirectory( mylib ) add_subdirectory( myapp )

mylib文件夹中的CMakeLists.txt包含:

add_library( mylib src/mylibclass.cpp include/mylib/mylibclass.h ) set_target_properties( mylib PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON ) target_include_directories( mylib PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> PRIVATE src )

而myapp文件夹中的一个包含:

add_executable( myapp src/myapp.cpp ) target_link_libraries( myapp mylib )

我想使用这个结构来开发mylib(作为BUILD_SHARED_LIBS确定的共享库或静态库)和myapp。 为此,我想在Visual Studio中将myapp设置为我的启动项目,并在MSVCdebugging器中进行编译和运行。 这是不可能的共享库的情况下没有额外的CMake代码,因为myapp.exe不知道在哪里可以findmylib.dll。

什么是最好的CMake实践告诉程序在哪里可以findDLL?

编辑:

根据@Andre的build议,我将以下几行添加到顶层CMakeLists.txt中:

set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/out CACHE STRING "" ) set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/out CACHE STRING "" )

CMake:如何禁用单个* .cpp文件的优化?

Windows窗体devise器重命名复制/粘贴控件

在Visual Studio 98的Visual Basic 6.0项目中设置/ TSAWARE的位置

是否有可能哄std :: atomic <T>输出CMPXCHG16B

是否有一个Visual C ++的__builtin_constant_p()?

发生此问题,因为您的mylib.dll不在您的myapp.exe相同的文件夹,也不是在Visual Studio尝试启动您的myapp.exe时在%PATH%环境变量中

显而易见的解决方案是确保DLL和EXE在同一个文件夹中。 做这件事有很多种方法

通过在目标上设置RUNTIME_OUTPUT_DIRECTORY和LIBRARY_OUTPUT_DIRECTORY属性,将exe和dll放到一个输出”目录中:

set_target_properties( myapp PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${sample_project_BINARY_DIR}/build_results/bin ) set_target_properties( mylib PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${sample_project_BINARY_DIR}/build_results/bin )

这将生成myapp.exe和mylib.dll到顶级生成文件夹中的一个build_results/bin文件夹中。

或者通过设置全局的CMAKE_RUNTIME_OUTPUT_DIRECTORY和CMAKE_LIBRARY_OUTPUT_DIRECTORY变量来完成,这将为您的sample_project中的所有目标执行此操作。

建立后,将dll复制到exe文件位置,例如

add_custom_command(TARGET mylib POST_BUILD COMMAND $ {CMAKE_COMMAND} -E复制mylib.dll $ {myapp_BINARY_DIR} /。)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐