c++是怎么做部署的

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

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

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

我们这种方案虽然是长期踩坑总结出来的,不过还是觉得很挫
fluyy
2018-02-04 22:35:42 +08:00
开发机和线上环境,测试环境系统版本一致,在开发机上编译通过,然后直接打包二进制部署文件部署
codehz
2018-02-04 22:41:23 +08:00
能静态链接就静态链接吧。。。
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
2018-02-04 23:44:18 +08:00
首先目标平台版本统一,autoconf+make/cmake+rpm/deb 最后依赖的 rpm/deb 全打一个 tar 包给他们。如果目标平台很杂还是用 docker 吧。
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
2018-02-05 00:50:17 +08:00
mark
htfy96
2018-02-05 00:51:16 +08:00
部署二进制,编译的时候指定 rpath,依赖库在编译的时候拷到 build/libs 下面,确保 build/在任何一个 Linux 下都能跑
xy90321
2018-02-05 00:51:49 +08:00
直接部署 bin +1
owt5008137
2018-02-05 09:29:41 +08:00
eaglexiang
2018-02-05 10:49:31 +08:00
我们自己构建了全套的库,编译成单个平坦二进制文件,写入 ROM 不会有任何问题
peihanw
2018-02-05 12:09:16 +08:00
OS 大版本和生产环境一致,cmake,第三方库尽量静态链接( lua、sqlite、curl 这些都静态链接),但是像 Oracle 的 OCI 没办法,就 LD_LIBRARY_PATH 吧。
dychenyi
2018-02-05 14:38:22 +08:00
动态链接也没关系关键是自己弄好 LD_LIBRARY_PATH, 我做 qt 的,windeploy linuxdeploy 工具都有。还是借助工具方便。
koth
2018-02-05 15:41:58 +08:00
用 bazel 编译,都静态化,然后拷贝。。。
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
2018-02-06 13:35:40 +08:00
@hackpro 动态链接 LD_LIBRARY_PATH 是这么用的啊。 比如程序有个模块编译成 so 了,那么设置好 LD_LIBRARY_PATH, 看 ldd,就能知道他调用那个 so 了。 这样适用于主程序不动,设置不同的 LD_LIBRARY_PATH,so 模块就可以实现版本化了。
hackpro
2018-02-07 14:24:37 +08:00
@dychenyi #16
如果希望从程序角度控制动态库版本的话 用 rPath 更合适

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/428427

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX