我有一个依赖于freetype6-dev软件包的程序。安装此软件包时,在Ubuntu 14.04和12.02上进行此操作时会得到不同的版本。在执行freetype-config --ftversion
时,分别得到2.5.2和2.4.8。我遇到的问题是当我尝试使用cmake找到这些库时。使用2.4.8,它找到ft2build.h然后进入<freetype/config/ftheader.h>
以找到标题的其余部分。在2.5.2中,它进入<config/ftheader.h>
。我没有在cmake中使用内置的FindFreeType,因为有一些已经包含ft2build.h的构建,我希望它使用该目录中的那个而不是系统。这是我的自定义FindFreeTypeTwo.cmake的样子。
1 # - Try to find Freetype2
2 # Once done this will define
3 #
4 # FREETYPE2_FOUND - system has FREETYPE2
5 # FREETYPE2_INCLUDE_DIR - the Freetype2 include directory
6 # FREETYPE2_LIBRARIES - Link these to use Freetype2
7
8 #handle the QUIETLY and REQUIRED arguments and set FREETYPE2_FOUND to TRUE if
9 #all listed variables are TRUE
10 FIND_PATH(_FREETYPE2_INCLUDE_DIR ft2build.h PATH_SUFFIXES freetype2)
11
12 FIND_LIBRARY(_FREETYPE2_LIBRARIES NAMES freetype)
13
14 INCLUDE(FindPackageHandleStandardArgs)
15 FIND_PACKAGE_HANDLE_STANDARD_ARGS(Freetype2 DEFAULT_MSG _FREETYPE2_LIBRARIES _FREETYPE2_INCLUDE_DIR)
16
17 MARK_AS_ADVANCED(FREETYPE2_INCLUDE_DIR FREETYPE2_LIBRARIES)
18
19 # Set up output variables
20 if (FREETYPE2_FOUND)
21 set (FREETYPE2_INCLUDE_DIR ${_FREETYPE2_INCLUDE_DIR})
22 set (FREETYPE2_LIBRARIES ${_FREETYPE2_LIBRARIES})
23 else(FREETYPE2_FOUND)
24 set (FREETYPE2_INCLUDE_DIR)
25 set (FREETYPE2_LIBRARIES)
26 endif (FREETYPE2_FOUND)
如果freetype-config --ftversion
为2.5.2而不是2.4.8则有效。如果我将其更改为
FIND_PATH(_FREETYPE2_INCLUDE_DIR ft2build.h)
...
if(FREETYPE2_FOUND)
set (FREETYPE2_INCLUDE_DIR ${_FREETYPE2_INCLUDE_DIR}/freetype2)
set (FREETYPE2_LIBRARIES ${_FREETYPE2_LIBRARIES})
else
...
我的程序可以在2.4.8中找到freetype的标题,但2.5.2会失败。
如何修改cmake以使其无论freetype版本如何都能正常工作?
答案 0 :(得分:0)
您可以在配置期间执行freetype-config --ftversion
,解析其输出并相应地选择FREETYPE2_INCLUDE_DIR
:
if(_FREETYPE2_INCLUDE_DIR)
execute_process (COMMAND "freetype-config" "--ftversion"
OUTPUT_VARIABLE version_output)
string (REGEX MATCH "([0-9]+)\\.([0-9]+)\\.([0-9]+)"
FREETYPE2_VERSION "${version_output}")
set(FREETYPE2_VERSION_MAJOR ${CMAKE_MATCH_1})
set(FREETYPE2_VERSION_MINOR ${CMAKE_MATCH_2})
set(FREETYPE2_VERSION_TWEAK ${CMAKE_MATCH_3})
if(FREETYPE2_VERSION_MINOR EQUAL "4")
set (FREETYPE2_INCLUDE_DIR ${_FREETYPE2_INCLUDE_DIR}/freetype2)
else()
set (FREETYPE2_INCLUDE_DIR ${_FREETYPE2_INCLUDE_DIR})
endif()
endif()
通过初始化与版本相关的变量,您还可以在version
来电中提出find_package()
请求。