c++ - CMake、Exe找不到DLL

标签 c++ visual-studio cmake cmake-gui

所以我尝试在 Windows 上使用 cmake 设置一个项目

这是我的项目结构:

  • 游戏引擎
    • .git
    • build
    • include
    • source
    • testing
    • CMakeLists.txt

“source”目录包含 GameEngine 库的所有 .cpp 文件,“include”目录包含所有头文件,“testing”目录用于测试库。所以它应该取决于 GameEngine.dll 和 GameEngine.lib(在 Windows 上)。

我的 顶级 CMakesLists.txt 包含:

    cmake_minimum_required(VERSION 2.7)
    PROJECT( GameEngine )

    include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include )

    ADD_SUBDIRECTORY( source )
    add_subdirectory( testing )


"source" 目录中的 CMakeLists.txt 包含:

    project(GameEngineLib)

    file(GLOB src "*.cpp" "../include/*.h")

    add_library(${PROJECT_NAME} SHARED ${src})


"testing" 目录中的 CMakeLists.txt 包含:

    project(Testing)

    file(GLOB src "*.h" "*.cpp")

    ADD_EXECUTABLE( ${PROJECT_NAME} ${src})
    target_link_libraries(${PROJECT_NAME} GameEngineLib)


这在 linux 上一切正常。
当我构建它时,我得到两个文件夹(+ 一些其他文件夹),“testing”和“source”以及一个输出可执行文件和 .so 文件的 Makefile。
并且可执行文件已经知道在哪里可以找到 .so 文件,所以我可以毫无错误地运行。


当我使用 Visual Studio 在 Windows 上构建时,问题就来了。
一切正常,除了我在构建“ALL_BUILD”项目后获得的测试可执行文件给我一个错误,说它找不到 GameEngineLib.dll。


我试着在谷歌上搜索如何解决这个问题,但我发现的大多数解决方案只是说你必须在 visual studio 中手动更改你的设置,以查找它所在的 dll。


但如果我在一个有多个开发人员的团队中工作,我真的不想让每个使用 visual studio 的开发人员都必须亲自进入并更改项目中的设置。


有没有办法告诉 cmake 自动将 GameEngineLib.dll 复制到 Tester.exe 的文件夹?

最佳答案

我正在尝试为 OpenCV 1.0.0 配备 CMake 支持并遇到非常相似的情况,即在我自己的解决方案中,有一个共享库(.dll)和一个从我的源构建的可执行文件(.exe)和头文件,以及执行那个.exe文件时,如何保证.exe能找到.dll?

正如@drescherjm 评论的那样,解决方案是:在根 CMakeLists.txt 中,在 add_subdirectory() 之前,添加这两行:

set(LIBRARY_OUTPUT_PATH "${CMAKE_BINARY_DIR}")
set(EXECUTABLE_OUTPUT_PATH "${CMAKE_BINARY_DIR}")

关于c++ - CMake、Exe找不到DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44909846/

相关文章:

c++ - 如果我在指向 vector 空元素的迭代器上调用方法,会发生什么?

c++ - Visual C++ STL 是人工生成的还是代码生成的?

visual-studio - 如何在 Visual Studio 和 CMake 中使用 clang-tidy?

c# - 从sql数据源获取数据到asp.net控件

makefile - cmake和并行构建与 "make -jN"

cmake - 我如何使用cmake --build建立多个目标

c++ - NoDecodeDelegateForThisImageFormat 使用 ImageMagick 读取 .png 文件时出错

c++ - '转换': 'class' OpenGL 3D type redefinition

c++ - 为什么动态绑定(bind)没有按预期运行?

c# - 在 Visual Studio 中通过 C# 类编译 C++ 代码