所以我试图在Windows上使用cmake设置项目
这就是我的项目结构:
这个想法是"来源"目录包含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的文件夹?
答案 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}")