首页 > 解决方案 > 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 libpngpkg-config

*更新了生成文件。删除了不必要的目标等。

标签: cmake

解决方案


  • 您将同时需要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})

推荐阅读