在Windows下编译时如何使用CMake的pkg_search_module()?

How to use CMake's pkg_search_module() when compiling under Windows?

我正在编写一个使用 SDL2 和 CMake 的游戏。 为了 link 并包含 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 生成器。

您可能已经知道,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 脚本添加到 ${CMAKE_SOURCE_DIR}/cmake/Modules 以查找 SDL2,然后您可以将该脚本与您的源代码一起交付。

我用过的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