---
# System prepended metadata

title: 'pkg-config: Finding Packages on Your System Easily'
tags: [Linux]

---

# pkg-config: Finding Packages on Your System Easily

## Introduction

If a package is installed with `pkg-config` configuation file (\*.pc), then the package informations can be easily found. The informations includes package version, compile flags, link flags, etc.

The `pkg-config` is convenient if a user wants to check whether a package is supported in a system, or needs compile options when building a project.

## The `pkg-config` Command

Here are some examples of `pkg-config` command:

* Print package version

  ```
  $ pkg-config --version expat
  0.29.2
  ```
  
* Print link flags
  
  ```
  $ pkg-config --libs  expat
  -lexpat
  ```
  
* Print variable
  \*.pc files can define variables. Most packages define variables like `prefix`, `libdir`.
  
  ```
  $ pkg-config --variable=prefix expat
  /usr
  
  $ pkg-config --variable=libdif expat
  /usr/lib64 
  ```
  
## Building a Project with `pkg-config`

To build a project base on the output of `pkg-config`, one can use command substitution to get the compile flags or link flags. This is more flexible than hardcoding flags in build scripts like makefile.

For example:

```
$ gcc hello.c -o hello $(pkg-config --cflags --libs ncurses)
```

The command expands to:

```
$ gcc hello.c -o hello -D_GNU_SOURCE -D_DEFAULT_SOURCE -lncurses -ltinfo
```

## A simple .pc File

Here is a simple .pc file in expat library:

```
$ cat expat.pc
prefix=/usr
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include

Name: expat
Version: 2.2.0
Description: expat XML parser
URL: http://www.libexpat.org
Libs: -L${libdir} -lexpat
Cflags: -I${includedir}
```

The .pc file format is simple that I think there is no need to have more explanation :slightly_smiling_face:.

## References
[1] [Guide to pkg-config (by Dan Nicholson)](https://people.freedesktop.org/~dbn/pkg-config-guide.html)
[2] [pkg-config man page](https://linux.die.net/man/1/pkg-config)
