【问题标题】:how to add pkg-config to a Makefile?如何将 pkg-config 添加到 Makefile?
【发布时间】:2017-01-24 18:10:40
【问题描述】:

我的 Makefile 看起来像这样:

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 中才能正常工作?

【问题讨论】:

  • 链接答案的总结:如果反引号不起作用,您也可以使用 $(shell [command[)。
  • pkg-config 的这种用法没有正确使用,只有一半。您只需使用-l 开关添加库,而不是它们存储在哪个目录中,即-L 开关。它可能有效,也可能无效。取决于您使用的库的设置方式。

标签: c++ c makefile mongo-c-driver


【解决方案1】:

我会制作一个看起来像这样的Makefile,所以它使用 make(1) 中已经存在的规则。 试试make -f /dev/null --print-data-base 看看他们。建议 grep-ing 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 $@

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

【讨论】:

    【解决方案2】:

    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

    【讨论】:

    • 我不明白您的回答,您能否更具体地说明如何将其添加到 makefile 中?谢谢
    • 使用反勾号`您可以调用另一个shell命令并将其结果替换为该位置。我会要求您更具体地说明您不了解的内容。
    • 非常感谢,这是我第一次在 makefile 中使用 pkg-config,但我不确定如何使用 synthax 以使其正常工作。所以我应该在我的 makefile 中的 LIBS= 之后使用你的合成器
    • 这不是关于makefile,这是关于shell。但是是的,你可以尝试在分配LIBS变量时使用它
    【解决方案3】:

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

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

    编译代码使用:

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

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

    这样你的 makefile 可能看起来像这样:

    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]。现在您的 makefile 可能如下所示:

    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
    

    希望这会有所帮助!

    【讨论】:

    • 我会设置CC=g++,然后一切都设置好了。 all 规则应该指向要构建的二进制文件,而不是源代码。所以all:mainall 所需要的。无需告诉make 如何编译和链接c 代码。它已经知道了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-30
    • 2013-02-13
    • 2013-12-25
    • 1970-01-01
    相关资源
    最近更新 更多