如何将 pkg-config 添加到 Makefile?
how to add pkg-config to a Makefile?
我的 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 中以使其工作?
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 = gcc
、CFLAGS
是一些其他编译器标志(如 -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
希望对您有所帮助!
我会制作一个看起来像这样的 Makefile
,所以它使用
make(1)
中已有的规则。
尝试 make -f /dev/null --print-data-base
查看它们。建议 grep
-ing COMPILE.c
和 LINK.c
以获得重要的东西。 COMPILE.cpp
、COMPILE.C
和 COMPILE.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 $@
有助于理解哪个变量去哪里。
我的 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 中以使其工作?
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 = gcc
、CFLAGS
是一些其他编译器标志(如 -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
希望对您有所帮助!
我会制作一个看起来像这样的 Makefile
,所以它使用
make(1)
中已有的规则。
尝试 make -f /dev/null --print-data-base
查看它们。建议 grep
-ing COMPILE.c
和 LINK.c
以获得重要的东西。 COMPILE.cpp
、COMPILE.C
和 COMPILE.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 $@
有助于理解哪个变量去哪里。