今天在编译之前写的一个opengl程序时,发现找不到glew库,原因是glew库升级了,CMakeLists.txt中find_package( )找不到glew库。于是,想到用pkg-config的方法配置第三方库。
-
pkg-config 就是一个命令工具,可以查询已安装库的基本信息,包括版本号、库路径、头文件路径、编译选项、链接选项等, 是一个在源代码编译时查询已安装的库的使用接口的计算机工具软件。
-
常用命令行
- 查询版本号
pkg-config --modversion glew # 查询glew版本号
- 输出:
2.1.0
- 查询库的基本信息
pkg-config --libs --cflags glew # 获取glew库的基本信息
- 输出:
-I/usr/local/Cellar/glew/2.1.0_1/include -L/usr/local/Cellar/glew/2.1.0_1/lib -lGLEW
pkg-config是如何找到这些信息的呢?其实,我们在安装第三方库时,会带有一个 .pc文件,比如glew库,.pc文件在本机中位于/usr/local/Cellar/glew/2.1.0_1/lib/pkgconfig/glew.pc,该文件包含了库的基本信息,内容如下:
prefix=/usr/local/Cellar/glew/2.1.0_1
exec_prefix=${prefix}
libdir=/usr/local/Cellar/glew/2.1.0_1/lib
includedir=${prefix}/include
Name: glew
Description: The OpenGL Extension Wrangler library
Version: 2.1.0
Cflags: -I${includedir}
Libs: -L${libdir} -lGLEW
Requires:
既然第三方库已经包含了基本信息,那么直接将这些配置信息应用到CMakeLists.txt中即可。具体写法如下:
find_package(PkgConfig)
pkg_search_module(GLEW REQUIRED glew)
MESSAGE(STATUS "glew dirs:" ${GLEW_INCLUDE_DIRS})
MESSAGE(STATUS "glew lib:" ${GLEW_LIBRARIES})
include_directories(${GLEW_INCLUDE_DIRS})
link_directories(${GLEW_LIBRARY_DIRS})
... ...
target_link_libraries(main ${GLUT_LIBRARY} ${OPENGL_LIBRARY} ${GLEW_LIBRARIES})
需要注意的是,以上方式获取的变量名与find_package()有所不同。
GLEW_INCLUDE_DIRS
GLEW_LIBRARY_DIRS
GLEW_LIBRARIES
GLEW_INCLUDE_DIR
GLEW_LIBRARY_DIR
GLEW_LIBRARY