C++ CMake和vcpkg进行包管理

因为想要做一个C++的docker,这样大家都可以用,但是又不想把已经安装和配置完成的库重新在docker上面安一遍。所以想看下C++有没有类似java的Maven的包管理工具。

结果谷歌了一圈,发现两个工具,一个是conan,好评很高,但是尴尬的是直接在本机上面跑之后,发现没法连接到官网,这可坑了。所以放弃了。

另一个是微软的vcpkg。包管理的策略和maven有些类似。

步骤如下,

  1. 需要先下载微软的vcpkg工程,然后在vcpkg/ports下面新建一个工程,例如我的工程是cppwork,建立方法如下,
    cd /vcpkg/ports
    创建的配置文件保存在cppwork目录下,远端工程URL为cppwork-master.zip,下载到本地的包名为cppwork.zip。
    vcpkg create cppwork https://git.appannie.org/fzhu/cppwork/-/archive/master/cppwork-master.zip cppwork.zip

  2. 修改一下/vcpkg/ports/cppwork目录下的vcpkg.json文件,添加上自己想要的依赖包。

{
  "name": "cppwork",
  "version-string": "",
  "homepage": "",
  "description": "",
  "dependencies": [
    {
      "name": "boost",
      "version>=": "1.76.0"
    },
    {
      "name": "pthread",
      "version>=": "3.0.0"
    },
    {
      "name": "nanodbc",
      "version>=": "2.13.0#4"
    },
    {
      "name": "pystring",
      "version>=": "1.1.3#4"
    },
    {
      "name": "yaml-cpp",
      "version>=": "0.7.0#1"
    },
    {
      "name": "protobuf",
      "version>=": "3.18.0"
    },
    {
      "name": "gtest",
      "version>=": "1.11.0"
    },
    {
      "name": "openssl",
      "version>=": "1.1.1l#1"
    },
    {
      "name": "opencv",
      "version>=": "4.5.3"
    }
 ],
  "builtin-baseline": "8275003fd8c5119cb9438fea1425ebe774f2e527"
}

注意这个builtin-baseline的来历和用途,可以参考知乎。主要是用来限定版本用的。
https://zhuanlan.zhihu.com/p/390410760

  1. 在/vcpkg/ports/cppwork目录下面执行vcpkg install,就可以安装所有依赖包了。
    其中 boost库因为包比较多,大概要安装30分钟到1小时左右。
    nanodbc库需要依赖autoconf进行配置。而且少了一个#include <limits> 声明,需要自己处理。
    autoconf需要依赖perl,所以要先安装perl。

其他的包就比较顺利了。

  1. vcpkg安装的包被安装在这个目录下,
    /vcpkg/ports/cppwork/vcpkg_installed/x64-linux
    目录格式如下,


    image.png
  2. 使用CMakeLists.txt文件来兼容Mac和Linux构建。

以前文《C++ 操作status io API生成yaml配置文件》的CMakeLists.txt文件为例,可以配置如下的CMakeLists.txt文件。
CMakeLists.txt

cmake_minimum_required(VERSION 2.6)

if(APPLE)
    message(STATUS "This is Apple, do nothing.")
elseif(UNIX)
    message(STATUS "This is linux, set CMAKE_PREFIX_PATH.")
    set(CMAKE_PREFIX_PATH /vcpkg/ports/cppwork/vcpkg_installed/x64-linux/share)
endif(APPLE)

project(get_incident_file)

add_definitions(-std=c++14)
add_definitions(-g)

find_package(ZLIB)

find_package(OpenCV REQUIRED )

find_package(Boost REQUIRED COMPONENTS
    system
    filesystem
    serialization
    program_options
    thread
    )


if(APPLE)
    MESSAGE(STATUS "This is APPLE, set INCLUDE_DIRS")
set(INCLUDE_DIRS ${Boost_INCLUDE_DIRS} /usr/local/include /usr/local/iODBC/include /opt/snowflake/snowflakeodbc/include/ ${CMAKE_CURRENT_SOURCE_DIR}/../../)
elseif(UNIX)
    MESSAGE(STATUS "This is linux, set INCLUDE_DIRS")
    set(INCLUDE_DIRS ${Boost_INCLUDE_DIRS} /usr/local/include ${CMAKE_CURRENT_SOURCE_DIR}/../../)
endif(APPLE)


if(APPLE)
    MESSAGE(STATUS "This is APPLE, set LINK_DIRS")
    set(LINK_DIRS /usr/local/lib /usr/local/iODBC/lib /opt/snowflake/snowflakeodbc/lib/universal)
elseif(UNIX)
    MESSAGE(STATUS "This is linux, set LINK_DIRS")
    set(LINK_DIRS ${Boost_INCLUDE_DIRS} /usr/local/lib /vcpkg/ports/cppwork/vcpkg_installed/x64-linux/lib)
endif(APPLE)

if(APPLE)
    MESSAGE(STATUS "This is APPLE, set ODBC_LIBS")
    set(ODBC_LIBS iodbc iodbcinst)
elseif(UNIX)
    MESSAGE(STATUS "This is linux, set LINK_DIRS")
    set(ODBC_LIBS odbc odbcinst ltdl)
endif(APPLE)

include_directories(${INCLUDE_DIRS})
LINK_DIRECTORIES(${LINK_DIRS})


file( GLOB APP_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../impl/*.cpp ${CMAKE_CURRENT_SOURCE_DIR}/*.h ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp  ${CMAKE_CURRENT_SOURCE_DIR}/../../http/impl/*.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../../yaml/impl/*.cpp)
foreach( sourcefile ${APP_SOURCES} )
        file(RELATIVE_PATH filename ${CMAKE_CURRENT_SOURCE_DIR} ${sourcefile})
    
        string(FIND "${filename}"  "test.cpp" "TEMP")
    if( NOT "${TEMP}" STREQUAL "-1" )
        string(REPLACE ".cpp" "" file ${filename})
        add_executable(${file}  ${APP_SOURCES})
        target_link_libraries(${file} ${Boost_LIBRARIES} ZLIB::ZLIB ${OpenCV_LIBS})
        target_link_libraries(${file}  ssl crypto libgtest.a libgtest_main.a pystring libyaml-cpp.a libgmock.a ${ODBC_LIBS} libnanodbc.a pthread)
    endif()
endforeach( sourcefile ${APP_SOURCES})

其中最重要的一点是Linux系统下需要设置CMAKE_PREFIX_PATH为vcpkg的share路径,这个路径下主要是存放,CMake find_package指令需要的各种.cmake文件。如果不加这一句,就会发现find_package各种不好用。

  1. Linux ~/.bash_profile环境变量文件里面加上这几个环境变量。


    image.png

其中,
这个是使用vcpkg必须。
export PATH=/vcpkg:$PATH

这两个是CMake查找头文件和库文件的路径。
export CMAKE_INCLUDE_PATH=/vcpkg/ports/cppwork/vcpkg_installed/x64-linux/include
export CMAKE_LIBRARY_PATH=/vcpkg/ports/cppwork/vcpkg_installed/x64-linux/lib

这两个是 Linux ODBC必须。
export ODBCINI=/etc/odbc.ini
export ODBCSYSINI=/etc

  1. 本文的实验环境, Fedora linux 35[最新版本]。
    使用Fedora最新版本的原因是Centos系比较稳定。
    另外最新的Fedora的gcc可以支持C++最新的C++2a版本。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352

推荐阅读更多精彩内容