CMake,Exe无法找到DLL

时间:2017-07-04 15:37:01

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

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

这就是我的项目结构:

  • GameEngine
    • 的.git
    • 构建
    • 包括
    • 测试
    • 的CMakeLists.txt

这个想法是"来源"目录包含GameEngine库的所有.cpp文件," include"目录包含所有头文件和"测试"目录用于测试库。所以它应该依赖于GameEngine.dll和GameEngine.lib(在Windows上)。

我的顶级 CMakesLists.txt包含:

$ gcc -Wall -Werror -Wextra -pedantic main.c
$ ./a.out 
sh$ This is a test
This is a test
sh$ See how well getline works!
See how well getline works!
sh$ 

sh$ quit
quit


$ 


"来源" 目录中的CMakeLists.txt包含:

    cmake_minimum_required(VERSION 2.7)
    PROJECT( GameEngine )

    include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include )

    ADD_SUBDIRECTORY( source )
    add_subdirectory( testing )


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

    project(GameEngineLib)

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

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


这一切都适用于Linux 当我构建它时,我得到两个文件夹(+其他一些),"测试"和"来源"和一个输出可执行文件和.so文件的Makefile 并且可执行文件已经知道在哪里找到.so文件,所以我可以运行而没有任何错误。


当我使用visual studio构建Windows时,问题就来了。
除了构建" ALL_BUILD"之后的测试可执行文件,一切都有效。项目,给我一个错误,说它找不到GameEngineLib.dll。


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


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


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

2 个答案:

答案 0 :(得分:1)

我有一个类似的问题,试图使用cmocka lib来创建测试。

甚至认为CMake使用find_library命令找到了你的库,如

mat4

你仍会遇到这个问题。

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

所以,如果你有像

这样的东西
find_library(<SOME_VAR> NAMES lib_name PATHS "where/to/search")

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

set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)

那就是它。

答案 1 :(得分:0)

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

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

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