Cmake:如何正确包含依赖项

时间:2018-08-09 22:48:25

标签: 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()还是find_packages()target_include_dirictories()是否也应与--cflagsglib-2.0 libpng之类的pkg-config之类的库一起使用?

*更新的makefile。删除了不必要的目标等。

1 个答案:

答案 0 :(得分:1)

  • 您将同时需要find_package()target_link_libraries()
  • 使用通过target_include_directories()找到的库时,
  • find_package几乎总是过时的。 Docs

示例

示例在带有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})