首先介绍命令行编译C++项目的方法,指出其问题所在。
g++的生成可执行文件语法:
g++ -o test test.c -I/home/include -pthread -L/usr/local/lib -llog4cpp
其中,
1,-I后表示要搜索的头文件的路径,系统默认的搜索路径包括/usr/include、/usr/local/include。添加了/home/include后,会先在/home/include的中搜索,其中-pthread就是待搜索的一个头文件。
通过locate pthread.h命令,可以看出,pthread.h 所在的路径为/usr/include。
2,-L后表示要搜索的动态链式库的路径,系统默认的搜索路径由环境变量LD_LIBRARY_PATH设置。
通过echo $LD_LIBRARY_PATH可以得到,-L默认的路径为/usr/local/lib:/usr/local/lib64:/usr/local/src/ACE_wrappers(自己设置的)
log4cpp表示待搜索的动态链式库,它的位置在/usr/local/lib。
问题:每次编译都需要考虑所引用的头文件,动态链接库,很麻烦。而且对于一些大的项目,像opencv,动态链接库不止一个两个,每一次编译项目时都写这么多链接库,不仅麻烦还容易出错。
下面进入正题了。
可以利用pkg-config读取配置文件的格式完成这部分工作,比如需要对log4cpp进行编译,就将其配置参数写在log4cpp.pc文件中,然后编译链接时,调用如下命令就可以完成编译链接。
g++ -o test test.cpp `pkg-config --libs --cflags log4cpp`
下面看看log4cpp.pc的内容,如下所示:
prefix=/usr/local
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include
Name: log4cpp
Description: C++ library for flexible logging, modeled after Log4j
Version: 1.1
Libs: -L${libdir} -llog4cpp
Cflags: -I${includedir} -pthread
Libs表示引用动态链接库的路径,以及需要的动态链接库;Cflags表示引用头文件的路径,以及需要的头文件。
-----------------------------------------------------------------------------------------------------------------------------------
下面简单介绍一下pkg-config,它的搜索路径可以参考说明书,man pkg-config
PKG_CONFIG_PATH
List of secondary directories where ‘.pc’ files are looked up.
PKG_CONFIG_LIBDIR
List of primary directories where ‘.pc’ files are looked up.
如上所示,pkg-config的搜索.pc的路径由PKG_CONFIG_LIBDIR、PKG_CONFIG_PATH共同确定,其中前者为第一路径,后者为第二路径。如果搜索查找路径下的所有.pc文件,可以通过pkg-config --list-all。