我编写了一个使用SDL2和CMake的游戏。 为了链接和包含SDL2,我使用以下CMake代码:
include(FindPkgConfig)
pkg_search_module(SDL2 REQUIRED sdl2)
target_link_libraries(MYLIB SDL2)
在Linux(Fedora)下编译时,这非常有效。
但是Windows怎么样?我没有DLL / a文件的标准系统位置,包括文件夹。甚至没有pkg-config。
这是我得到的错误:
Could NOT find PkgConfig (missing: PKG_CONFIG_EXECUTABLE)
checking for one of the modules 'sdl2'
CMake Error at C:/Program Files (x86)/CMake/share/cmake-3.0/Modules/FindPkgConfig.cmake:425 (message):
None of the required 'sdl2' found
Call Stack (most recent call first):
.../CMakeLists.txt:4 (pkg_search_module)
我使用了VS 2013生成器。
答案 0 :(得分:4)
您可能已经知道,pkg_search_module()
依赖于pkg-config
程序来查找依赖项。正如您所指出的,Windows并没有pkg-config
。您可能能够安装它并以这种方式工作,但对于跨平台构建而言,可能更好的替代方法是使用CMake的find_package()
函数。这样,您就可以消除在开发人员计算机上安装pkg-config
的依赖性。
cmake_minimum_required(VERSION 3.1)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules")
find_package(SDL2 REQUIRED)
add_executable(sdl2demo sdl2demo.cpp)
target_include_directories(sdl2demo SYSTEM PRIVATE "${SDL2_INCLUDE_DIR}")
target_link_libraries(sdl2demo "${SDL2_LIBRARY}")
CMake没有找到SDL2的模块,因此您需要将其添加到源目录中。这就是上面设置CMAKE_MODULE_PATH
的原因;你添加了一个跨平台工作的cmake脚本,用于查找SDL2到${CMAKE_SOURCE_DIR}/cmake/Modules
,然后你可以用源代码提供该脚本。
我使用的FindSDL2.cmake模块是:http://freerct.googlecode.com/svn/trunk/CMake/FindSDL2.cmake
如果SDL2安装在标准位置,则该脚本应该能够找到它。如果SDL2未安装在标准位置或无法通过此脚本找到,则开发人员必须配置相应的CMake变量以告知CMake适当的位置,之后配置和构建将能够正常进行。
cmake <source dir> -G "Visual Studio 12 2013 Win64" -DSDL2_INCLUDE_DIR=<sdl dir>/include -DSDL2MAIN_LIBRARY=<sdl dir>/lib/x64/SDL2main.lib -DSDL2_LIBRARY=<sdl dir>/lib/x64/SDL2.lib