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})