CMake、Exe找不到DLL
CMake, Exe cant find DLL
所以我正在尝试使用 cmake
在 windows 上设置一个项目
这是我的项目结构:
- 游戏引擎
- .git
- build
- include
- source
- 测试
- 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.
我试着在 google 上搜索如何解决这个问题,但我发现的大多数解决方案只是说你必须手动更改 visual studio 中的设置以查找 dll,它所在的位置.
但如果我在一个有多个开发人员的团队中工作,我真的不想让每个使用 visual studio 的开发人员都必须自己进入并更改项目中的设置。
没有办法告诉 cmake 自动将 GameEngineLib.dll 复制到 Tester.exe 的文件夹吗?
我在尝试使用 cmocka 库创建测试时遇到了类似的问题。
甚至认为 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})
就是这样。
我正在尝试为 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}")
所以我正在尝试使用 cmake
在 windows 上设置一个项目这是我的项目结构:
- 游戏引擎
- .git
- build
- include
- source
- 测试
- 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.
我试着在 google 上搜索如何解决这个问题,但我发现的大多数解决方案只是说你必须手动更改 visual studio 中的设置以查找 dll,它所在的位置.
但如果我在一个有多个开发人员的团队中工作,我真的不想让每个使用 visual studio 的开发人员都必须自己进入并更改项目中的设置。
没有办法告诉 cmake 自动将 GameEngineLib.dll 复制到 Tester.exe 的文件夹吗?
我在尝试使用 cmocka 库创建测试时遇到了类似的问题。
甚至认为 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})
就是这样。
我正在尝试为 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}")