freebsd 代码移植时 gcc 相关bug

原创 2015年11月21日 02:35:38

在移植linux代码到 freebsd 系统时,出现各种错误。现将所有错误一一罗列下来,并给出相关的解决方案。

to_string is not a member of std

编辑如下文件 test.cpp

#include <string>
using namespace std;

int main()
{
    string s = std::to_string(42);
    cout << s << endl;
    return 0;
}

编译指令:

gcc -std=c++11 test.cpp test

会报错:

test.cpp: In function 'int main()':
test.cpp:6:18: error: 'to_string' is not a member of 'std'
  std::string s = std::to_string(42);

freebsd 官方的mail list 里找到原因是默认的 g++ 没有打开对 c++11 的支持。详情见文末参考链接1。

On 8.x one of the gcc ports has to be used if you need a c++11 library,
but it appears that the declarations of to_string in bits/basic_string.h
are hidden behind #ifdef _GLIBCXX_USE_C99 and that macro isn’t defined
on FreeBSD because we are missing a few obscure c99 functions.
I think it would be best to patch the gcc ports to force the definition
of that macro.

问题在于没有定义宏_GLIBCXX_USE_C99 gcc 默认不开启 c++11 支持。

需要使用如下编译指令:

g++ -std=c++11 -D_GLIBCXX_USE_C99 test.cpp -o test

链接运行时库

我的工程的编译指令如下:

g++48 -std=c++11 -D_GLIBCXX_USE_C99 -Wall -g main.cpp server.cpp mysh.cpp pipeVector.cpp clientPool.cpp fifo.cpp -o remote_csh

编译能通过,但在运行时会报错:

/usr/local/lib/compat/libstdc++.so.6: version GLIBCXX_3.4.17 required by /net/other/2016_1/0440052/remote_work/remote_csh not found

又是在freebsd 官方的论坛里找到答案,详情见参考链接2。

运行指令

strings /usr/local/lib/gcc47/libstdc++.so.6|grep GLIBCXX

输出如下

GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_DEBUG_MESSAGE_LENGTH

发现version GLIBCXX_3.4.17 就在动态库 /usr/local/lib/gcc47/libstdc++.so.6 中,而 gcc 默认链接的是库 /usr/local/lib/compat/libstdc++.so.6

可以使用ldd remote_csh 来验证。

如此以来,原因就清晰了,我们需要链接运行时库/usr/local/lib/gcc47/libstdc++.so.6

只需修改编译指令为:

g++48 -std=c++11 -D_GLIBCXX_USE_C99 -Wall -g main.cpp server.cpp mysh.c    pp pipeVector.cpp clientPool.cpp fifo.cpp -o remote_csh -R/usr/local/lib/gcc48/

这里需要值得注意的是:

现代连接器在处理动态库时将链接时路径(Link-time path)和运行时路径(Run-time path)分开,用户可以通过-L指定连接时库的路径,通过-R(或-rpath)指定程序运行时库的路径

关于 Linux 静态库与动态库搜索路径设置详解可进一步,见参考链接3。

参考

c++11-lib on FreeBSD 8.4:Mail List

Howto: building and running c++0x apps on FreeBSD

http://blog.chinaunix.net/uid-29025972-id-3855495.html

使用rosserial创建一个publisher

在arduino开发人群中,经常把源代码称为“sketch”,之后,我们就会使用这个惯例。打开一个终端,启动arduino: [html] view plaincopy ...

boost源码剖析之:泛型多维数组类multi_array

boost源码剖析之:boost::multi_array 谢轩 刘未鹏C++的罗浮宫(http://blog.csdn.net/pongba) Note: 并非新作,是以前和老朋友谢轩写的,也可...

C代码从GCC到MSVC的移植

原文地址:http://blog.csdn.net/ariesjzj/article/details/7881049 要把一个项目的build系统从gcc移植到MSVC,困难之一在于源码中使用了gcc...

C代码从GCC到MSVC的移植

http://blog.csdn.net/jinzhuojun/article/details/7881049版权声明:本文为博主原创文章,未经博主允许不得转载。 原文地址:http://blog....

代码从GCC到MSVC的移植

摘自:http://blog.csdn.net/ariesjzj/article/details/7881049 原文地址:http://blog.csdn.net/ariesjzj...

学生信息管理系统(在LINUX下用GCC编译需要更改conio.h为curses.h并修改相关代码)

摘 要 通过一学期对C语言的学习,设计一个关于学生成绩管理系统,能够检测同学们对于此科目的学习情况,以及强化学生的操作能力。此程序的主要功能: (1)        能按学期,班级完成对学生的成绩...

GCC Coverage代码分析-GCC如何编译生成gcov/gcov-dump程序及其bug分析

本博客(http://blog.csdn.net/livelylittlefish)贴出作者(阿波)相关研究、学习内容所做的笔记,欢迎广大朋友指正! Content 0. 序 1.编译g...

FreeBSD 10 将使用 Clang 编译器替换 GCC

来自 phoronix 的消息称,根据 FreeBSD 2012 第一季度的状态报告 显示,来自 LLVM 的 Clang 编译器将成为 FreeBSD 10 的默认 C/C++ 编译器,废弃...

嵌入式Linux内核移植相关代码分析

饮水思源 - 主题文章阅读  [讨论区: Embedded] 本主题共有 6 篇文章,分 1 页, 当前显示第 1 页 [返回讨论区] [回复本文][原帖] 发...

uClinux内核移植相关代码分析

原作者:张洪耿     来源:www.linuxforum.net        本文通过整理之前研发的一个项目(ARM7TDMI + uCLinux),分析内核启动过程及需要修改的文件,以供内...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:freebsd 代码移植时 gcc 相关bug
举报原因:
原因补充:

(最多只允许输入30个字)