如何将 pkg-config 添加到生成文件

how to add pkg-config to a Makefile?

本文关键字:文件 添加 pkg-config      更新时间:2023-10-16

我的制作文件看起来像这样:

all:main.cpp
    g++ -I../../DrAPI/ -Wl,--no-as-needed -ldl -lrt -o SampleApp01 $< 
clean:
    rm -f SampleApp01

这是我在没有 Makefile 的情况下会做的事情:

gcc main.cpp -o test $(pkg-config --cflags --libs libmongoc-1.0)

现在由于导入 DrAPI,我也必须使用 Makefile 来包含该 API,但是如果没有 pkg-config,我将丢失 libmongoc-1.0。在这种情况下,我应该如何将 $(pkg-config --cflags --libs libmongoc-1.0) 添加到我的 Makefile 中才能正常工作?

我会做一个看起来像这样的Makefile,所以它使用已经在make(1)中的规则.尝试make -f /dev/null --print-data-base查看它们。建议grep COMPILE.cLINK.c来获取重要的东西。 COMPILE.cppCOMPILE.CCOMPILE.cxx用于C++,COMPILE.c用于C。

#!/bin/make
# Makefile
# 2020-02-10 Anders Jackson
# Basic setup
CXX       = g++
CXXFLAGS  = -c -g -Wall -Wextra
CXXFLAGS += -I../../DrAPI/
LDFLAGS   =
LDLIBS    = -ldl -lrt
# `pkg-config --list-all | grep -e mongo` will find if installed
# Here is the libmongoc-1.0 setup.
CXXFLAGS += `pkg-config --cflags          libmongoc-1.0`
LDFLAGS  += `pkg-config --libs-only-L     libmongoc-1.0`
LDLIBS   += `pgk-config --libs-only-other libmongoc-1.0`
LDLIBS   += `pkg-config --libs-only-l     libmongoc-1.0`
# Adjusting for this project
SOURCES = main.cpp
OBJECTS = $(SOURCES:.cpp=.o)
EXECS = main
all: $(EXECS)      # Link exec from objects
$(OBJECTS):        # Make all .o from .cpp (no local header files)
clean:
      -rm $(OBJECTS)
      -rm $(EXECS)
# eof

请注意,此处的对象文件仅依赖于源文件。 如果源文件具有一些本地头文件依赖项,则需要手动添加它们。

此文件还确保在链接时,这些-L开关在目标文件之前,-l开关在目标文件之后。如果您尝试在LDFLAGS中仅使用一种pkg-config --libs,它将不起作用。我也只是在变量中添加一件事 += ,就像 LDLIBS 一样,因为它可以更容易地看到添加的内容。

内置规则包括:

OUTPUT_OPTION = -o $@
# Compilation for C and C++
COMPILE.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $(OUTPUT_OPTION) $<
COMPILE.cpp = $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $(OUTPUT_OPTION) $<
# Linking for C and C++
LINK.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) $^ $(LOADLIBES) $(LDLIBS) -o $@
LINK.cpp = $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) $^ $(LOADLIBES) $(LDLIBS) -o $@

它有助于了解哪个变量去哪里。

all:main.cpp g++ -I../../DrAPI/ `pkg-config --cflags --libs libmongoc-1.0` -Wl,--no-as-needed -ldl -lrt -o SampleApp01 $< clean: rm -f SampleApp01

当我使用 GTK+ 库编译我的 C 代码时,我创建了一个名为 GTK 的变量,并将其设置为如下所示pkg-config

GTK = `pkg-config --cflags --libs gtk+-3.0`

使用以下方法编译代码:

$(CC) $(CFLAGS) $(OBJECTS) $(GTK) -o $@

其中CC = gccCFLAGS是一些其他编译器标志(如-I ../../DrAPI),OBJECTS是源文件和目标文件。

这样,您的生成文件可能如下所示:

DRAPI = `pkg-config --cflags --libs libmongoc-1.0`
all:main.cpp
    g++ -I../../DrAPI/ -Wl,--no-as-needed -ldl -lrt $(DRAPI) -o SampleApp01 $< 
clean:
    rm -f SampleApp01

编辑:忘记这个。使用 CFLAGS 变量和存储pkg-config --cflags [some library, eg. gtk+-3.0],使用 LIBS 变量存储pkg-config --libs [some library again] 。现在,您的生成文件可能如下所示:

CFLAGS = -I../../DrAPI/ -Wl,--no-as-needed -ldl -lrt `pkg-config --cflags libmongoc-1.0`
LIBS = `pkg-config --libs libmongoc-1.0`
all:main.cpp
    g++ $(CFLAGS) $(LIBS) -o SampleApp01 $< 
clean:
    rm -f SampleApp01

希望这有帮助!