在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
我正在编写一个使用 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