Linux和FreeBSD在使用非系统自带的gcc时的区别

Qt5:for Android问题cannot find -lc++ Qt5配置完Android环境后编译会出现 cannot find -lc++ linker command failed with exit code 1 (use -v to see invocation) 情况;因为是NDK 在R17以后对libc++.so进行版本控制,实际内容都是一样的,内容是是指向-lc++_shared, 只是Qt中libQt5Core.so链接库时没有进行对... 阅读详情

 
下面拿CentOS 5和FreeBSD 9.0做下比较:
 
CentOS 5 自带的gcc是gcc (GCC) 4.1.2,通过yum可以安装gcc44 (GCC) 4.4.4
 
FreeBSD 9.0 自带的gcc是gcc (GCC) 4.2.1,通过ports可以安装gcc 4.6 (目前是4.6.2)
 
我们用C++写一个非常简单的C++程序:
 
int main(){
  return 0;
}
 
然后用g++编译:
 
# g++44 main.cpp -o main
 
然后用ldd查看,Linux下的输出结果为:
       libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x000000336f000000)
        libm.so.6 => /lib64/libm.so.6 (0x000000336cc00000)
       libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x000000336e400000)
        libc.so.6 => /lib64/libc.so.6 (0x000000336c400000)
        /lib64/ld-linux-x86-64.so.2 (0x000000336c000000)
 
FreeBSD下的输出结果为:
      libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0×800849000)
        libm.so.5 => /lib/libm.so.5 (0x800b59000)
       libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x800d7a000)
        libc.so.7 => /lib/libc.so.7 (0x800f87000)
 
其中有两行我故意标红了。因为他们是来自于gcc。那么就有这么一个问题:不同版本的gcc,这两个库,一样吗?或者我这么问,gcc 4.4、gcc 4.6、gcc 4.2、gcc 4.1相比,他们的C++标准库(libstdc++.so)的接口一样吗? 实现一样吗?(此处指需要被编译的那部分,如非模板类)
 
我们来看看CentOS怎么做的:
 
CentOS 5的gcc44-c++这个包,只带了两个so。/usr/lib/gcc/x86_64-redhat-linux6E/4.4.4/32/libstdc++.so和/usr/lib/gcc/x86_64-redhat-linux6E/4.4.4/libstdc++.so。而这两个so竟然只是文本文件,内容大概是这样:
INPUT ( -lstdc++_nonshared /usr/lib64/libstdc++.so.6 )
 
也就是说,它会静态链接到/usr/lib/gcc/x86_64-redhat-linux6E/4.4.4/libstdc++_nonshared.a这个文件,并动态链接到/usr/lib64/libstdc++.so.6(这个文件由gcc 4.1提供)
 
所以,在CentOS 5中,用gcc 4.4编译出来的东西,运行环境不需要安装gcc 4.4 !
 
然后看FreeBSD怎么做的:
 
gcc 4.6的so,安装在/usr/local/lib/gcc46/目录下。如果你是在64位环境下安装的,那么只有64位版本的,没有32位版本的。最关键的是,它确实是一个elf格式的so,而不是文本文件、软链接什么的。
 
如果在FreeBSD下这么编译一个文件:
 
# g++46 -o t test.cpp
 
那么它会错误的链接到4.2的so上
 
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0×800849000)
libm.so.5 => /lib/libm.so.5 (0x800b59000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x800d7a000)
libc.so.7 => /lib/libc.so.7 (0x800f87000)
 
你的程序还能不能正常工作,那就看天命了。正确的做法是,在链接的时候加上-Wl,-rpath=/usr/local/lib/gcc46 。
 
FreeBSD的官网上有一个文档解释了这个问题:http://www.freebsd.org/doc/en/articles/custom-gcc/article.html但是这个文档有点老,而且写的不是很详细。
 
现在如果只是为了让ports用gcc 4.6,那么直接在/etc/make.conf中加入“USE_GCC=4.6”即可
,
作者 snnn
freebsd平台编译openwrt 最开始接触的是linux,用一叠软盘装salckware,当时一盒软盘10个,要用十几个软盘。后来用过一段时间sun工作站,还用solaris9维护过一个小型局域网。 现在的ubuntu版本linux感觉隐藏的细节太多了,还是更喜欢简单的方式。相对于systemv的风格,更喜欢bsd风格。 freebsd和linux在系统头文件定义和系统调用方面有些区别,在freebsd平台编译为linux平 阅读详情

相关推荐

FreeBSD 11.0 安装可用 Git 的完整实践指南

Git 是分布式版本控制的核心工具,其在类 Unix 系统中的正确部署依赖于编译器、SSL 库、正则引擎与线程模型的协同适配。FreeBSD 11.0 作为基于 GCC 4.8.5 和 OpenSSL 1.0.2j 的经典稳定分支,存在 TLSv1.2 支持不足、POSIX 线程语义缺失、PCRE 和 Python 扩展默认禁用等底层限制,导致 `pkg install git` 获取的 Git 2.7.x 版本无法满足现代 CI/CD、UTF-8 路径处理及 `git push --force-with-

weixin_34345753的博客 356

gcc 4.8.5 的string问题

gcc 4.8.5的调用

lanxiaziyi的专栏 1223

标准C语言编译器

CC 转自CC和GCC编译器   从名字上看,老的unix系统的CC程式叫做C Compiler。但GCC这个名字按GNU的说法叫做Gnu Compiler Collection。因为gcc包含非常多编译器(C, C++, Objective-C, Ada, Fortran,and Java)。所以他们是不相同的,一个是个古老的C编译器,一个是编译器的Gnu的编译器的集合(Gcc里的C编译器...

jdgdf566的专栏 2677

CentOS上GCC多版本GCC Toolset支持探究

由于稳定性的要求,CentOS上的默认GCC版本通常比较低,比如CentOS 8上是GCC 8.5,而目前GCC已经发布了GCC 12.2,这对开发者是不太友好的,如果开发着想使用高版本特性就必须自己编译一个高版本GCC出来,比较麻烦,也不利于维护。 那么有没有办法可以让开发者像安装默认GCC编译器一样,使用yum install的方式安装rpm包呢?CentOS提供了GCC Toolset机制。

Compiler爱好者 7548

FreeBSD 10.1 pkg 工具深度解析:ABI 兼容性与二进制包管理

FreeBSD 的 pkg 并非传统意义上的包管理器,而是以 ABI 兼容性为核心的二进制契约验证系统。它基于严格的构建时符号绑定(如 libssl.so.8)、静态依赖声明和 SQLite 元数据校验,确保每个安装包在特定 base 系统(如 FreeBSD 10.1 的 libc + OpenSSL 1.0.2u)下零冲突运行。这种设计牺牲了 apt-style 的自动依赖求解能力,却换来了金融网关、DNS 根镜像等关键场景所需的十年级稳定性。其核心价值体现在仓库锁定(freebsd:10:x86:64

weixin_30588675的博客 412

什么是Linux发行版 以及各发行版的区别

Linux 发行版是由:Linux内核、GNU 工具、附加软件和软件包管理器组成的一整套完整操作系统,其也可能包括了显示服务器和 Linux 桌面环境,通常被运作于服务器或桌面操作系统来使用。

S_ZaiJiangHu的博客 4286

用devtoolset-7-gcc 搭建的gcc使用有问题

问题描述 编译结束链接时会提示跳过 不兼容的 libstdc++_nonshared.a,找不到该库失败 解决方案 我搜了很多国外论坛都没有解决方案,最终还是回到原点编译安装了gcc正式版本!

2009

49、高级软件管理:在FreeBSD上运行非原生软件的全面指南

本文深入探讨了在FreeBSD系统上运行非原生软件的多种方法,包括重新编译、模拟和ABI重新实现。重点介绍了Linux模式(Linuxulator)的安装、配置、使用与调试技巧,涵盖共享库重映射、二进制品牌管理、用户空间设置及常见问题处理。通过流程图、案例分析和实用命令示例,帮助系统管理员高效运行Linux等平台软件,并确保兼容性与性能。同时总结了各方法的优缺点及未来发展趋势,是FreeBSD高级软件管理的全面指南。

k8l9m0n的博客 68

CentOS cannot fin d -Istdc++ nonshared 错误解决方案

在CentOS 7 系统中,使用 `make` 命令时出现 `cannot fin d -Istdc++ nonshared` 错误 , 错误截图如下

小白的博客 363

ai数字人系统部署

这段代码实现了基本的语音交互闭环,用户通过语音输入问题,数字人识别语音后进行自然语言理解并生成回复,再将回复转换为语音输出。但实际应用中的 AI 数字人系统更为复杂,如形象渲染需专业图形引擎(如 Unity、Unreal Engine),自然语言处理也会涉及更复杂的模型微调及多轮对话管理等。一个完整的 AI 数字人系统涵盖形象生成、自然语言处理、动作控制等多个复杂功能,下面为你提供一个 Python 示例,整合多个库来实现数字人基础功能,包括语音交互、简单的自然语言理解以及通过虚拟形象展示对话。

weixin_ggwwsscc的博客 368

在没有信用卡的情况下怎么申请谷歌云(Google Cloud)?

这笔额度足够用来跑一台云服务器、部署小型网站,甚至可以尝试 AI、机器学习等项目。但问题来了——想要拿到这 300 美元,你必须先通过支付方式验证。默认选项就是绑定一张国际信用卡(Visa、MasterCard 之类),然而不少人没有信用卡,或者信用卡无法支持国际支付,结果就卡在注册第一步。很多人会疑惑:既然是送额度,为什么还要绑卡?原因其实很简单:谷歌需要确认你是真实用户,而不是批量注册薅羊毛;通过支付验证,后续如果你用完 300 美元额度,可以直接进行付费使用;

m0_74824483的博客 5650

FreeBSD使用基础

今天安装了FreeBSD, 对于习惯了Linux的用户而言, 还是有点不一样。 1. SSH登陆. 用putty登陆BSD主机, 输入root账号和密码, 会出现 Using keyboard-interactive authentication, 并且无法登陆成功, 原因在于bsd的ssh默认禁止远程使用root登陆主机, 可以用vi修改 /etc/ssh/sshd_config文件, 将pe

windseeker2008的专栏 1236

MySQL8.2.0下载安装

4、点击No thanks,just start my download,就是只是开始下载的意思,点击下载,等待下载完成。5、新建空白行,或直接双击紧挨的空白行,把复制的mysql的安装路径bin路径复制粘贴过来,确定,确定,确定。1、上面点击finish后,自动勾选了run mysql配置,自动会打开配置页面,点击Next。1、双击安装包,进入安装流程,勾选我同意 I accept,next。2、根据自己需要选择,我选的第二个,可以自己改安装路径。2、默认,点击Next,记住默认端口3306。

m0_59681797的博客 1万+

UbuntuBSD:将 Ubuntu 和 FreeBSD 融合一起Linux发行版

不止是在 Linux 的内核上面你才能体验到 的快捷方便,伙计们。UbuntuBSD 可以让你在 FreeBSD 的内核上面也能体验到那种方便快捷。 UbuntuBSD 称自己是 Unix for human beings,这一点也不人惊讶。如过你能想起来的话,Ubuntu 使用的标语是 Linux for human beings ,并且在过去的 11 年里它确实让一个正常人...

m0_43427010的博客 1014

Deepseek:物理神经网络PINN入门教程

物理信息网络(Physics-Informed Neural Networks, PINN)是一种将物理定律(如偏微分方程、守恒定律等)嵌入神经网络训练过程的深度学习方法。其核心思想是通过神经网络同时拟合观测数据并满足物理约束,从而解决传统数值方法难以处理的高维、噪声数据或复杂边界条件问题。

金石软件 9297

【uniapp踩坑记】App Store上传失败:Invalid Swift Support错误怎么解决?

作为一个前端出身的开发者,用 uniapp 开发原生 App 已经够挑战了,打包 iOS 上传 App Store 更是处处暗雷。这次的坑虽然小,但确实容易忽略。如果你也遇到了类似的报错,希望这篇文章能帮你少踩一次坑!

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1142

虚拟机(Linux)系统知识普及:什么是Linux发行版 以及各发行版的区别

虚拟机(Linux)系统知识普及:什么是Linux发行版 以及各发行版的区别

weixin_54626591的博客 1839

【调优】OpenClaw调优之模型(tokens)篇

OpenClaw用户常遇四大痛点:规则被无视、API账单暴涨、低效模型选择、记忆丢失。通过/context list命令可解析上下文组成,包括工作区配置、引导参数限制、系统提示词等关键信息。重点需关注Token消耗来源,如核心配置文件、技能工具说明等,避免静默截断。建议精简非必要内容,优化记忆机制,平衡功能与成本。该分析帮助用户减少无效操作,合理控制API支出。

海兰 989

【嵌入式Linux】补充部分

本部分主要专注构建从0到1的嵌入式Linux学习知识体系,主要设计环境配置,嵌入式Linux基础部分,Linux文件系统及系统移植,驱动开发等知识。 目前持续更新中,更新时间:2022年11月12日Linux的起源:从一个故事说起 FreeBSD与Linux十个本质上的区别 什么是GUN? POSIX标准是什么? Linux的基本概念和特点 Citrix,微软,VMware:它们的优缺点 什么是类Unix系统? UNIX/Linux系统结构 Linux x86 和ARM什么区别? 为什么STM32没法跑Li

CodeAllen嵌入式 831

S32DS S32K312 LPSPI + DMA配置异步SPI

配置DMA->Specific Configuration->Dma Logic Channel->Configuration->Global。SpiPhyUnitMapping:将该配置Mapping到某一路Spi,此工程配置为Spi1,遂选择LPSPI_1。配置的该路SPI的片选ID,此处ID对应配置Pin脚时lpspi_pcs后的下表(本工程此处为PCS3)配置该路SPI对应的SPI硬件单元ID,本工程配置为Lpspi1,因此配置为CSIB1。首先配置SPI的Pin脚,此处使用的是LPSPI_1。

希望我的博客,能帮上你解决学习中工作中所遇到的问题 2361

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

gcc中-pthread和-lpthread的区别

一般情况下,我们在链接一个(文件名为libxxx.so或libxxx.a等的)库时,会使用-lxxx的方式;在Linux中要用到多线程时,需要链接pthread库,按照惯例,我们应该使用-lpthread的方式来进行链接;但是,通过日常的观察,我发现很多开源代码都是使用了-pthread参数,而非使用-lpthread,这是为什么呢? 一通Google后,总算找到一些线索: 为了可移植

... 1059

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

类UNIX系统终极对比:Linux、BSD、macOS谁才是你的最佳选择?

在当今数字化时代,类UNIX系统以其稳定性、安全性和灵活性成为技术领域的中流砥柱。Linux、BSD和macOS作为其中的代表,各自拥有独特的优势和适用场景。本文将深入剖析这三大系统的核心特性、应用领域及优缺点,助你找到最适合自己的类UNIX操作系统。 ## 起源与定位:三大系统的基因差异 类UNIX系统均继承了1960年代AT&T贝尔实验室开发的UNIX操作系统的设计哲学,但在发展路径上走向

gitblog_00650的博客 792

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

用宏区分操作系统和编译器

原文地址:用宏区分操作系统和编译器 作者:yandaren_1220 编码的时候经常要用到条件编译,每次都到网上去查比较浪费时间,今天总结一下以备后用 编译器 GCC #ifdef __GNUC__ #if __GNUC__ >= 3 // GCC3.0以上 Visual C++ #ifdef _MSC_VER(非VC编译器很多地方也有定义)...

weixin_34185320的博客 79

FreeBSD 10.1 手动构建 FAMP 栈:Ports 编译与 ZFS/ kqueue 深度优化

FAMP(FreeBSD + Apache + MySQL + PHP)是面向类 Unix 系统的 Web 服务基础架构,其核心在于操作系统内核、文件系统与应用层的协同。在 FreeBSD 平台上,ZFS 提供数据完整性保障,kqueue 实现高效事件驱动,而 Ports 系统赋予开发者对编译参数、依赖链和安全基线的完全掌控力——这远超 pkg 二进制分发的黑盒封装。相比泛化的 LAMP 教程,FAMP 在 FreeBSD 中强调可审计性、可复现性与底层适配,尤其适用于工业采集(如 php rs485)、安

weixin_33737774的博客 324

编译工具make、gmake、cmake、nmake和Dmake的区别

现有编译工具 -----------------       gmake是GNU Make的缩写。       Linux系统环境下的make就是GNU Make,之所以有gmake,是因为在别的平台上,make一般被占用,GNU make只好叫gmake了。       比如在安装二进制文件进行编译时要使用make命令,但如果在Solaris或其他非GNU系统中运行,必须使用GNU make...

sinat_36391009的博客 380
上一篇: Freebsd make install clean checksum error
下一篇: freeBSD挂载windows共享文件夹
Kelvin-Liang
博客等级 码龄18年 9粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值