关于g++静态编译的疑问?

danscort2000 2018-07-10 11:35:21
由于需要将服务器程序移植到 Linux平台,安装了最新版本ubuntu linux [64bit] ,和 主流的服务器平台centos,代码移植编译测试本身很 顺利,没遇到bug, 但是 有 个疑问一直没有想通,
因为需要支持多个Linux发行版,最简单的 办法就是静态编译,先后在ubuntu linux ,centos下分别进行编译,centos下得到的可执行程序大小为1.4MB, centos linux 核心 3.10.0-862.6.3.e17.x86_64 g++版本: 4.8.5-28 ,
同样的编译参数 在ubuntu linux下得到可执行文件大小为3.8MB,ubuntu linx 核心;4.15.0-23 g++版本 7.3.0
这差距实在是太大了,足足一倍多,
我使用ubuntu linux下编译出来的 可执行服务器程序,在 centos下运行没有任何问题,全兼容
使用centos下编译出来的可执行服务器程序,在 ubuntu下 运行也 同样没有任何问题,全兼容
使用file 指令分析可 执行文件 ,
ubuntu 下可执行文件 头提示: for GNU/Linux 3.2.0
Centos下可 执行文件 头提示: for GNU/Linux 2.6.32
但事实是,无论是那个,都可以完美运行在其他平台,哪怕核心版本不如文件头要求的版本
另外请教,有没有宏或参数可以在 g++ 编译中 指定 Linux 内核版本, 否则glibc等打包进来的 东西太大了


...全文
254 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
泡浴露 2018-07-11
  • 打赏
  • 举报
回复
你可以先这样尝试一下,看看能不能编过和能不能正常运行。
编译参数的话,我不太清楚有没有这样的。
我估计是没有,因为如果有的话,代表你可以任意传入不同的版本参数,但实际上你的开发环境可能压根就没有这个版本的静态库啊。
泡浴露 2018-07-11
  • 打赏
  • 举报
回复
引用 3 楼 danscort2000 的回复:
[quote=引用 2 楼 qq_20892953 的回复:]
可以啊,比如按如下步骤
1.使用脚本检测你所谓的Linux内核版本,比如说检查到Linux 2.6.32,然后生产g++语句,比如:g++ -g -Wall -D LINUX_CORE_VERSION_2.6.32 -c hellworld.cpp -o hellworld.o -I...
2.在hellworld.cpp中判断宏LINUX_CORE_VERSION
int main()
{
int i = 0;
#if defined(LINUX_CORE_VERSION_2.6.32)
i=1;
#elif defined(LINUX_CORE_VERSION_3.2.0)
i=2;
#endif
}


谢谢,我觉得你误解我的意思了,你这个只是在代码里面做版本区别,而
我的意思是让glibc 和stdc++ 的静态库,按编译参数指定Linux核心版本不同进行不同的连接,这样当我指定Linux核心版本例如2.6
那么就只静态连接2.6版本glibc,而不是现在这样的整个最新版本glibc库全部进去,那样太大了
[/quote]

明白你意思了
你在ubuntu linux下得到可执行文件大小为3.8MB,在centos下得到的可执行程序大小为1.4MB。

ubuntu linux 核心 4.15.0-23 g++版本 7.3.0
centos linux 核心 3.10.0-862.6.3.e17.x86_64 g++版本 4.8.5-28

所以你的意思是,因为链接了较高版本的静态库,所以导致编译出来的二进制较大。

我觉得可以这样尝试一下,把centos linux下的低版本的静态库拷贝到ubuntu linux下,然后更改一下静态库的软链接到低版本的库上,再编译试试。
这样做仅仅是尝试,实际要用到生产环境的话,还是不可取,不再同一个编译环境编出来的,谁晓得会出现什么问题。


danscort2000 2018-07-10
  • 打赏
  • 举报
回复
引用 2 楼 qq_20892953 的回复:
可以啊,比如按如下步骤
1.使用脚本检测你所谓的Linux内核版本,比如说检查到Linux 2.6.32,然后生产g++语句,比如:g++ -g -Wall -D LINUX_CORE_VERSION_2.6.32 -c hellworld.cpp -o hellworld.o -I...
2.在hellworld.cpp中判断宏LINUX_CORE_VERSION
int main()
{
int i = 0;
#if defined(LINUX_CORE_VERSION_2.6.32)
i=1;
#elif defined(LINUX_CORE_VERSION_3.2.0)
i=2;
#endif
}


谢谢,我觉得你误解我的意思了,你这个只是在代码里面做版本区别,而
我的意思是让glibc 和stdc++ 的静态库,按编译参数指定Linux核心版本不同进行不同的连接,这样当我指定Linux核心版本例如2.6
那么就只静态连接2.6版本glibc,而不是现在这样的整个最新版本glibc库全部进去,那样太大了
泡浴露 2018-07-10
  • 打赏
  • 举报
回复
可以啊,比如按如下步骤
1.使用脚本检测你所谓的Linux内核版本,比如说检查到Linux 2.6.32,然后生产g++语句,比如:g++ -g -Wall -D LINUX_CORE_VERSION_2.6.32 -c hellworld.cpp -o hellworld.o -I...
2.在hellworld.cpp中判断宏LINUX_CORE_VERSION
int main()
{
int i = 0;
#if defined(LINUX_CORE_VERSION_2.6.32)
i=1;
#elif defined(LINUX_CORE_VERSION_3.2.0)
i=2;
#endif
}

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧