【问题标题】:CMake, Exe cant find DLLCMake,Exe找不到DLL
【发布时间】:2017-12-08 03:43:42
【问题描述】:

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

这是我的项目结构的样子:

  • 游戏引擎
    • .git
    • 构建
    • 包括
    • 来源
    • 测试
    • 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 上运行良好。
当我构建它时,我得到两个文件夹(+ 一些其他文件夹),“测试”和“源代码”以及一个输出可执行文件和 .so 文件的 Makefile。
并且可执行文件已经知道在哪里可以找到 .so 文件,所以我可以运行而不会出现任何错误。


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


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


但是如果我在一个有多个开发人员的团队中工作,我真的不希望每个使用 Visual Studio 的开发人员都必须自己进入并更改项目中的设置。


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

【问题讨论】:

  • 我使用的一个选项是从除顶层之外的所有项目中删除 project(),并在 add_subdirectory()s 之前的根 CMakeLists.txt 中设置输出文件夹
  • isn't there a way to tell cmake to automatically copy the GameEngineLib.dll to the Tester.exe's folder? - Stack Overflow 上有 many questions 关于使用 CMake 复制 .dll。选择其中之一并继续。

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


【解决方案1】:

我在尝试使用 cmocka lib 创建测试时遇到了类似的问题。

甚至认为 CMake 使用 find_library 之类的命令找到了您的库

find_library(<SOME_VAR> NAMES lib_name PATHS "where/to/search")

你还是会遇到这个问题。

Windows 执行将无法找到 .dll。您可以通过添加存储在可执行文件旁边的这个库来解决这个问题。

所以如果你有类似的东西

set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)

在您的 CMakeLists.txt 文件中,您只需添加

file(COPY ${SOME_VAR}
    DESTINATION ${EXECUTABLE_OUTPUT_PATH})

就是这样。

【讨论】:

  • EXECUTABLE_OUTPUT_PATH 已弃用;根据 CMake 3.18,他们推荐 RUNTIME_OUTPUT_DIRECTORY
  • 如果您的解决方案中有多个 cmake 项目,这很好,但您可以自动从外部库复制文件吗?
【解决方案2】:

我正在尝试为 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}")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-08
    • 2017-10-28
    • 2017-03-05
    • 1970-01-01
    • 1970-01-01
    • 2021-04-08
    相关资源
    最近更新 更多