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

时间:2015-02-21 20:41:02

标签: c++ windows visual-studio-2013 cmake sdl-2

我编写了一个使用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生成器。

1 个答案:

答案 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