在使用freetype 2
库构建C ++ 11项目时,使用cmake
在linux下链接extern C
时遇到了麻烦。
使用cmake和freetype 2我基本上有2个选项:
freetype-config
freetype-config --libs
FindFreetype
cmake module 现在我正在尝试实施第二个选项,而且我对cmake
不是很熟练,也不了解它的逻辑。
我的问题是链接阶段,我不知道如何正确地做到这一点加上这个模块不像freetype-config --libs
的结果那样完整,它真正包含了我需要的所有库和标志,而不仅仅是文件的路径;所以我假设我必须为zlib
和libpng
做同样的事情。
CMakeLists.txt
cmake_minimum_required (VERSION 2.6)
project (FreetypeTutorials1)
include(FindFreetype)
include_directories(${FREETYPE_INCLUDE_DIRS})
SET(CMAKE_CXX_FLAGS "-O2 -std=c++11")
SET(CMAKE_EXE_LINKER_FLAGS "-v -lfreetype")
add_executable( demo "${CMAKE_CURRENT_SOURCE_DIR}/src/main.cpp")
./src/main.cpp
(只是一些随机代码,所以我有东西可以提供给编译器)
extern "C" {
#include <ft2build.h>
#include FT_FREETYPE_H
}
#include <iostream>
int main()
{
FT_Library library;
auto error = FT_Init_FreeType(&library);
if (error)
{
std::cout << "An error !\n";
}
}
答案 0 :(得分:10)
要加载像FindFreetype.cmake
这样的模块,您需要在find_package
- 命令的cmake中使用它。第一个参数是包名称。 &#34;发现&#34;它的相应文件名由cmake自动添加。
虽然include
可能与find_package
一起使用,但您可以添加一些标记。例如,如下所示,REQUIRED
,在找不到自由类型时使cmake失败。
此外,使用命令target_link_libraries
进行与cmake的链接。
我就是这样写你的CMakeLists.txt:
cmake_minimum_required (VERSION 2.6)
project (FreetypeTutorials1)
find_package(Freetype REQUIRED)
include_directories(${FREETYPE_INCLUDE_DIRS})
SET(CMAKE_CXX_FLAGS "-O2 -std=c++11")
SET(CMAKE_EXE_LINKER_FLAGS "-v")
add_executable( demo src/main.cpp) # CMAKE_CURRENT_SOURCE_DIR is implicit here
target_link_libraries(demo ${FREETYPE_LIBRARIES})
target_link_libraries
与平台无关,而'-lfreetype
中的CMAKE_EXE_LINKER_FLAGS
则不是。
CMakeLists.txt可以在其他可用freetype的平台上运行。