linux 中編譯時對於多版本庫的調用管理

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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章