How to use the command 'pkg-config' (with examples)
The pkg-config
command is an indispensable tool in the development ecosystem, particularly when dealing with libraries. It provides the essential details about installed libraries, enabling developers to compile applications efficiently without manually specifying the dependencies and flags associated with each library. This tool assists in retrieving the package-specific compilation and linking parameters, ensuring that programs are built correctly with all necessary components.
Use case 1: Get the list of libraries and their dependencies
Code:
pkg-config --libs library1 library2 ...
Motivation:
When developing software applications, especially larger projects, one needs to manage multiple libraries and their dependencies. Ensuring compatibility and proper linkage of all required libraries can be quite arduous. The motivation behind using this command lies in its ability to automatically fetch and list the required libraries along with their dependencies. This not only saves time but also reduces errors associated with manual handling of library flags.
Explanation:
pkg-config
: This is the command-line utility we’re using to manage library linking.--libs
: This argument instructspkg-config
to return the linking flags for the specified libraries. These flags include the path and reference for linking the libraries during the compile time to ensure the application can access required library functions.library1 library2 ...
: Replace these placeholders with the actual library names you’re interested in, e.g.,glib-2.0
orlibxml-2.0
. This enablespkg-config
to search for the libraries installed on your system and present the necessary link flags for each.
Example Output:
-L/usr/lib -llib1 -llib2 -ldependency1 -ldependency2
In this output, -L/usr/lib
provides the directory path where the libraries are situated, whereas -llib1
and -llib2
specify the libraries themselves. -ldependency1
and -ldependency2
are additional dependencies that those libraries rely on.
Use case 2: Get the list of libraries, their dependencies, and proper cflags for gcc
Code:
pkg-config --cflags --libs library1 library2 ...
Motivation:
When compiling code, especially when using a complex setup or a multitude of external libraries, it becomes crucial to include both the correct compiler flags (cflags) and linker flags (libs). These flags ensure that not only are the libraries linked correctly, but the source code is also compiled with the appropriate options. By requesting both cflags and libs, a developer is presented with comprehensive configuration parameters required to transition smoothly from source code to executable.
Explanation:
pkg-config
: The utility being used.--cflags
: Requests configuration flags needed by the compiler. These often includeinclude
paths and other compiler instructions.--libs
: Requests flags needed by the linker to successfully link the libraries.library1 library2 ...
: Replace these with the libraries you’re working with, allowingpkg-config
to extract both compiling and linking information.
Example Output:
-I/usr/include/library1 -I/usr/include/library2 -L/usr/lib -llib1 -llib2 -ldependency1 -ldependency2
In the example output, -I/usr/include/library1
and -I/usr/include/library2
define paths to header files that should be included during the compilation process. The linker flags are similar to the previous usage, ensuring proper linking.
Use case 3: Compile your code with libgtk-3, libwebkit2gtk-4.0 and all their dependencies
Code:
c++ example.cpp $(pkg-config --cflags --libs gtk+-3.0 webkit2gtk-4.0) -o example
Motivation:
This particular command combines pkg-config
with a C++ compiler command, illustrating the power of integrating pkg-config
output directly into a compilation command. When dealing with GUI applications, libraries such as GTK+ and WebKitGTK are often used together. Using this command helps in seamlessly incorporating all necessary compiling and linking parameters, making the development process faster and error-free.
Explanation:
c++
: The compiler used to compile the C++ source code.example.cpp
: The source file containing the C++ code.$(pkg-config --cflags --libs gtk+-3.0 webkit2gtk-4.0)
: This expression within subshell command syntax executespkg-config
, requesting all compilation and linking flags for the specified libraries.gtk+-3.0
andwebkit2gtk-4.0
are the libraries of interest here.-o example
: Specifies that the output of the compilation should be an executable file namedexample
.
Example Output:
Assuming the command executes successfully without explicit output but results in an executable:
example # This is the compiled executable file.
Running this executable would then launch the application built with GTK+ and WebKit functionalities.
Conclusion:
The pkg-config
command brings much-needed automation and ease to handling library configurations during the development process. These use cases illustrate its application in simplifying the task of managing library dependencies, cflags, and linking flags, which are essential for the seamless creation and execution of software projects. By understanding how to leverage pkg-config
, developers can focus more on the core functionalities of their applications, leaving the complex configurations to this adept tool.