cmake - Cmake:如何正确包含依赖项
问题描述
在旧的 Makefile 中有一个包含部分:
SHELL=/bin/sh
CORE_SRC=\
./Core/allocator.cpp \
./Core/etc... \
CORE_OBJS=$(CORE_SRC:.cpp=.o)
INCLUDE=\
`pkg-config --cflags glib-2.0 libpng` \
`sdl-config --cflags` \
`freetype-config --cflags` \
`./python-config-linux.sh --cflags` \
-I./TopLayer -I./etc...
CC=g++-4.4
CFLAGS=-O3 -pipe -Wall -fPIC -D__STDC_CONSTANT_MACROS
CORE_LFLAGS=\
-fPIC \
-Wl,-rpath,./libs
CORE_LDLIBS=\
`pkg-config --libs glib-2.0 libpng` \
`sdl-config --libs` -lz -ljpeg \
`freetype-config --libs` \
`curl-config --libs` \
-L./$(LIBSDIR) \
-letc...
GAME_LFLAGS=\
-shared -pthread -fPIC \
-Wl,-rpath,../libs
GAME_LDLIBS=\
-lm \
`python-config-linux.sh --libs`
target_name: $(CORE_OBJS) $(CORE_NAME)
target_name: override CFLAGS += -DAV_OUTPUT
$(CORE_NAME): $(CORE_OBJS)
$(CC) $(CORE_LFLAGS) $(CORE_OBJS) $(CORE_LDLIBS) -o $@
.c.o:
$(CC) $(CFLAGS) $(INCLUDE) -c $< -o $*.o
.cpp.o:
$(CC) $(CFLAGS) $(INCLUDE) -c $< -o $@
这些配置的执行是:
$pkg-config --cflags glib-2.0 libpng
-> -I/usr/include/glib-2.0 -I/usr/lib/i386-linux-gnu/glib-2.0/include -I/usr/include/libpng12
$sdl-config --cflags
-> -I/usr/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT
$freetype-config --cflags
-> -I/usr/include/freetype2
$./python-config-linux.sh --cflags
-> -I/python-2.7.10/include/python2.7 -I/python-2.7.10/include/python2.7 -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes
我对 Cmake 不了解并且有点困惑 - 我应该使用target_include_dirictories()
orfind_packages()
吗?还应该target_include_dirictories()
与for--cflags
和 libs一起使用吗? glib-2.0 libpng
pkg-config
*更新了生成文件。删除了不必要的目标等。
解决方案
- 您将同时需要
find_package()
和target_link_libraries()
。 target_include_directories()
使用通过find_package
. 文档。
例子
使用 CMake 3.12 在 macOS HighSierra 上测试的示例。
project(Example)
cmake_minimum_required(VERSION 3.10)
find_package(PNG REQUIRED)
add_executable(prog main.c) # main.c from: http://zarb.org/~gc/html/libpng.html
target_link_libraries(prog PNG)
# On Ubuntu 14.04 + CMake 3.2 use the older syntax (FindPNG.cmake is too old) from the next line:
# target_link_libraries(prog ${PNG_LIBRARIES})
推荐阅读
- reactjs - 如果黑客无法访问用户计算机,他如何执行 xss 攻击?
- flutter - 如何在颤振项目中存储 AES 私钥?
- substrate - 如何列出创建的节点
- excel - 如何将时间戳和用户名添加到列?
- python - Django:将 CreateView 映射到现有表单模板
- php - spatie 错误:未加载 PermissionServiceProvider(Laravel 权限)
- python - 递归函数内部发生了什么
- windows - BTH_DEVICE_INFO_LIST IOCTL 执行
- python - 如何在 jupyter notebook 中读取其他单元格
- mysql - ORA-02070 - 尝试删除带有文本的记录时