V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hardwork
V2EX  ›  C

c++是怎么做部署的

  •  
  •   hardwork · 2018-02-04 22:02:42 +08:00 · 3866 次点击
    这是一个创建于 2481 天前的主题,其中的信息可能已经有所发展或是发生改变。
    现在 cmake 用的比较多,很多开源都是老的 automake 构建,想请教一下大家公司里 c++程序怎么做服务端部署?
    在部署服务器上装上完整的编译工具链和依赖库,然后直接编译运行吗,或者是 docker 部署。有没有部署直接部署二进制的方式?
    还有就是现在各种类库依赖,都用同版本 gcc 再编译一遍吗?如果不这样,好像有 c++11abi 问题。
    google 的 chrome 项目直接自己一整套编译链,用的自己搞的 gni,是客户端。
    一般公司怎么做的呢,服务端客户端 c++程序的构建和部署?
    17 条回复    2018-02-07 14:24:37 +08:00
    SPACELAN
        1
    SPACELAN  
       2018-02-04 22:28:33 +08:00
    在 centos 6 上用 4.8.2 编译,然后静态链接 libstdc++和其他三方依赖

    abi 可用通过编译时设置选项强制使用旧的 abi,而且好像只有 gcc5 以下和以上混合链接才会出现这个问题

    chrome 那一套似乎也只要求 4.8.2 ?

    我们这种方案虽然是长期踩坑总结出来的,不过还是觉得很挫
    fluyy
        2
    fluyy  
       2018-02-04 22:35:42 +08:00
    开发机和线上环境,测试环境系统版本一致,在开发机上编译通过,然后直接打包二进制部署文件部署
    codehz
        3
    codehz  
       2018-02-04 22:41:23 +08:00 via Android
    能静态链接就静态链接吧。。。
    skydiver
        4
    skydiver  
       2018-02-04 22:44:06 +08:00
    @fluyy +1

    在相同版本的编译机上编译,然后打包二进制包部署。版本一样的系统,编译器也一样,不会有什么 abi 问题。
    旧版 centos 可以安装 devtoolset,现在最新的是 https://www.softwarecollections.org/en/scls/rhscl/devtoolset-7/ ,这样就可以有新版 gcc 可用
    redsonic
        5
    redsonic  
       2018-02-04 23:44:18 +08:00
    首先目标平台版本统一,autoconf+make/cmake+rpm/deb 最后依赖的 rpm/deb 全打一个 tar 包给他们。如果目标平台很杂还是用 docker 吧。
    ETiV
        6
    ETiV  
       2018-02-05 00:39:19 +08:00
    我们用两种功能的 docker image,都基于 Debian:

    - 一个用来 cmake build ; build 完丢进启用了 git-lfs 的 git repo ;

    - 一个用来运行,里面放了动态链接库的文件,指定好 LD_LIBRARY_PATH 环境变量。


    运行的时候使用 -v 把可执行程序的目录挂载进去,指定 workdir,然后 entrypoint 就是编译好的程序
    visionsmile
        7
    visionsmile  
       2018-02-05 00:50:17 +08:00 via Android
    mark
    htfy96
        8
    htfy96  
       2018-02-05 00:51:16 +08:00
    部署二进制,编译的时候指定 rpath,依赖库在编译的时候拷到 build/libs 下面,确保 build/在任何一个 Linux 下都能跑
    xy90321
        9
    xy90321  
       2018-02-05 00:51:49 +08:00 via iPhone
    直接部署 bin +1
    owt5008137
        10
    owt5008137  
       2018-02-05 09:29:41 +08:00 via Android   ❤️ 1
    eaglexiang
        11
    eaglexiang  
       2018-02-05 10:49:31 +08:00 via Android
    我们自己构建了全套的库,编译成单个平坦二进制文件,写入 ROM 不会有任何问题
    peihanw
        12
    peihanw  
       2018-02-05 12:09:16 +08:00
    OS 大版本和生产环境一致,cmake,第三方库尽量静态链接( lua、sqlite、curl 这些都静态链接),但是像 Oracle 的 OCI 没办法,就 LD_LIBRARY_PATH 吧。
    dychenyi
        13
    dychenyi  
       2018-02-05 14:38:22 +08:00
    动态链接也没关系关键是自己弄好 LD_LIBRARY_PATH, 我做 qt 的,windeploy linuxdeploy 工具都有。还是借助工具方便。
    koth
        14
    koth  
       2018-02-05 15:41:58 +08:00
    用 bazel 编译,都静态化,然后拷贝。。。
    hackpro
        15
    hackpro  
       2018-02-06 12:13:56 +08:00
    要源代码编译的 直接 AutoTools+pkg-config 吧 缺什么补什么就行

    二进制部署的 参考 @htfy96 #8 设置好 rPath

    @peihanw #12
    @dychenyi #13
    Shared Library LD_LIBRARY_PATH 不是这么用的吧……
    dychenyi
        16
    dychenyi  
       2018-02-06 13:35:40 +08:00
    @hackpro 动态链接 LD_LIBRARY_PATH 是这么用的啊。 比如程序有个模块编译成 so 了,那么设置好 LD_LIBRARY_PATH, 看 ldd,就能知道他调用那个 so 了。 这样适用于主程序不动,设置不同的 LD_LIBRARY_PATH,so 模块就可以实现版本化了。
    hackpro
        17
    hackpro  
       2018-02-07 14:24:37 +08:00
    @dychenyi #16
    如果希望从程序角度控制动态库版本的话 用 rPath 更合适
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2745 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 15:36 · PVG 23:36 · LAX 07:36 · JFK 10:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.