gpt4 book ai didi

c++ - 如何最好地告诉 CMake 在哪里可以找到 dll

转载 作者:可可西里 更新时间:2023-11-01 11:47:49 28 4
gpt4 key购买 nike

我有一个简单的项目结构,源自令人惊叹的教程

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 包含:

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 设置为我的启动项目,并在 MSVC 调试器中编译运行。对于没有额外 CMake 代码的共享库情况,这是不可能的,因为 myapp.exe 不知道在哪里可以找到 mylib.dll。

告诉程序在哪里可以找到 dll 的最佳 CMake 实践是什么?

编辑:

根据@Andre 的建议,我在顶层 CMakeLists.txt 中添加了以下行:

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

最佳答案

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

显而易见的解决方案是确保 dll 和 exe 都在同一个文件夹中。有几种方法可以做到这一点:

  1. 通过设置 RUNTIME_OUTPUT_DIRECTORY 将 exe 和 dll 放入单个“输出”目录中和 LIBRARY_OUTPUT_DIRECTORY目标上的属性:

    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 文件夹中。

  1. 或者通过设置全局 CMAKE_RUNTIME_OUTPUT_DIRECTORYCMAKE_LIBRARY_OUTPUT_DIRECTORY将为您的 sample_project 中的所有目标执行此操作的变量。

  2. 构建后将dll复制到exe位置,例如与

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

关于c++ - 如何最好地告诉 CMake 在哪里可以找到 dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39807664/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com