linux 使用makefile编译工程时,经常会链接一些开源代码的库,这些一般会有多个版本的发布,这时如果要灵活指定工程调用的开源库,常见的方法是使用pkg-config方法。
1,我这里以opencv,为例。目前opencv在github 上有3个branch。下载source code 到本地库。分别编译三个branch的最新源码到 /usr/local/opencv3.0.0-rc1 /usr/local/opencv4 /usr/local/opencv2 三个目录 下。
2,更改pkg-config相关的配置。进入/usr/local/opencv3.0.0-rc1/lib/pkgconfig/ ,里面会有一个opencv3.0.0-rc1.pc 的配置文件,这个文件的名字是之后pkg-config --libs --cflags opencv3.0.0-rc1 指令里的标签,这个名字可以按照自己的意愿。把这个*.pc文件加入到/etc/bash.bashrc 文件中,然后让其生效。可以参数另一个文档https://blog.csdn.net/taohaiwu/article/details/79500295
3,在终端中$:pkg-config --libs --cflags opencv3.0.0-rc1 会打印如下 LOG
-I/usr/local/opencv3.0.0-rc1/include/opencv -I/usr/local/opencv3.0.0-rc1/include /usr/local/opencv3.0.0-rc1/lib/libopencv_calib3d.so /usr/local/opencv3.0.0-rc1/lib/libopencv_core.so /usr/local/opencv3.0.0-rc1/lib/libopencv_features2d.so /usr/local/opencv3.0.0-rc1/lib/libopencv_flann.so /usr/local/opencv3.0.0-rc1/lib/libopencv_hal.a /usr/local/opencv3.0.0-rc1/lib/libopencv_highgui.so /usr/local/opencv3.0.0-rc1/lib/libopencv_imgcodecs.so /usr/local/opencv3.0.0-rc1/lib/libopencv_imgproc.so /usr/local/opencv3.0.0-rc1/lib/libopencv_ml.so /usr/local/opencv3.0.0-rc1/lib/libopencv_objdetect.so /usr/local/opencv3.0.0-rc1/lib/libopencv_photo.so /usr/local/opencv3.0.0-rc1/lib/libopencv_shape.so /usr/local/opencv3.0.0-rc1/lib/libopencv_stitching.so /usr/local/opencv3.0.0-rc1/lib/libopencv_superres.so /usr/local/opencv3.0.0-rc1/lib/libopencv_ts.a /usr/local/opencv3.0.0-rc1/lib/libopencv_video.so /usr/local/opencv3.0.0-rc1/lib/libopencv_videoio.so /usr/local/opencv3.0.0-rc1/lib/libopencv_videostab.so
4,在工程的CMakeLists.txt 里面引用这个pkg-config
cmake_minimum_required(VERSION 2.8)
SET(TARGET_OS linux_x86_64)
if("${TARGET_OS}" STREQUAL "linux_x86_64")
message(STATUS "TARGET_OS = ${TARGET_OS}")
endif()
project(hello)
if("${TARGET_OS}" STREQUAL "linux_x86_64")
include(FindPkgConfig)
pkg_check_modules(PKGS REQUIRED
opencv3.0.0-rc1
)
include_directories(${PKGS_INCLUDE_DIRS})
link_directories(${PKGS_LIBRARY_DIRS})
#add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0)
elseif()
set(CMAKE_C_FLAGS "-pie -fPIE ")
set(CMAKE_CXX_FLAGS "-pie -fPIE ")
set(CMAKE_LD_FLAGS "-pie -fPIE ")
endif()
message(STATUS "CMAKE_C_COMPILER = ${CMAKE_C_COMPILER}")
message(STATUS "CMAKE_C_FLAGS = " ${CMAKE_C_FLAGS})
message(STATUS "CMAKE_CXX_FLAGS = " ${CMAKE_CXX_FLAGS})
message(STATUS "CMAKE_LD_FLAGS = " ${CMAKE_LD_FLAGS})
add_executable(hello1 hello.cpp)
target_link_libraries(hello1 ${PKGS_LDFLAGS})