Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use pkg-config in Make

Tags:

c

gcc

makefile

gtk

I want to compile the simplest GTK program. I can compile it using the command line:

gcc $(pkg-config --cflags --libs gtk+-3.0)  main.c -o main.o 

However, if I use Make it doesnt work:

CFLAGS=-g -Wall -Wextra $(pkg-config --cflags) LDFLAGS=$(pkg-config --libs gtk+-3.0) CC=gcc  SOURCES=$(wildcard *.c) EXECUTABLES=$(patsubst %.c,%,$(SOURCES))  all: $(EXECUTABLES) 

It tells me this:

gcc -g -Wall -Wextra    -c -o main.o main.c main.c:1:21: fatal error: gtk/gtk.h: No such file or directory  #include <gtk/gtk.h>                      ^ compilation terminated. <builtin>: recipe for target 'main.o' failed make: *** [main.o] Error 1 

Where do I stick $(pkg-config --cflags --libs gtk+-3.0) in the Makefile to make it compile?

Thanks very much in advance for your kind help.

like image 227
Jenia Ivanov Avatar asked Feb 16 '15 00:02

Jenia Ivanov


People also ask

Where is pkg-config file?

On most systems, pkg-config looks in /usr/lib/pkgconfig , /usr/share/pkgconfig , /usr/local/lib/pkgconfig and /usr/local/share/pkgconfig for these files. It will additionally look in the colon-separated (on Windows, semicolon-separated) list of directories specified by the PKG_CONFIG_PATH environment variable.

What is pkg-config package?

pkg-config is a helper tool used when compiling applications and libraries. It helps you insert the correct compiler options on the command line so an application can use gcc -o test test.


1 Answers

There are two issues.

First, your CFLAGS line is wrong: you forgot to say gtk+-3.0 in the pkg-config part, so pkg-config will spit out an error instead:

CFLAGS=-g -Wall -Wextra $(pkg-config --cflags gtk+-3.0) 

Second, and more important, $(...) is intercepted by make itself for variable substitution. In fact, you've seen this already:

SOURCES=$(wildcard *.c) EXECUTABLES=$(patsubst %.c,%,$(SOURCES))  all: $(EXECUTABLES) 

is all done by make.

There are two things you can do.

First, you can use `...` instead, which does the same thing ($(...) is newer shell syntax).

CFLAGS=-g -Wall -Wextra `pkg-config --cflags gtk+-3.0` LDFLAGS=`pkg-config --libs gtk+-3.0` 

Second, since you seem to be using GNU make, you can use the shell substitution command, which was shown in the answer Basile Starynkevitch linked above:

CFLAGS=-g -Wall -Wextra $(shell pkg-config --cflags gtk+-3.0) LDFLAGS=$(shell pkg-config --libs gtk+-3.0) 
like image 103
andlabs Avatar answered Sep 23 '22 00:09

andlabs