如何使用c ++ 11实用工具交叉编译基于具有静态链接的目标的静态库

时间:2018-09-14 16:39:31

标签: c++11 gcc arm cross-compiling crosstool-ng

**编辑:发现我的问题。如以下答案所述,制作静态库时,我实际上没有进行任何链接。相反,我创建了一个共享库并静态链接了libstdc ++。

Compile a static library link with standard library (static) **

我正在尝试创建一种在运行内核(2.6.37)的古老手臂平台上使用c ++ 11的方法。不幸的是,我们BSP包含的最新交叉编译是GCC 4.5.3,它不支持我们需要的所有c ++ 11实用程序。

最初,我尝试使用crosstool-ng的旧版本来构建交叉编译器,但是旧版本太坏了。较新的版本不支持2.6.37内核。我能够完成一个构建,但是没有构建g ++二进制文件,从而使整个工作毫无用处(我确实检查了是否在menuconfig中启用了c ++)。

因此,我的最后一个选择是在4.9.4版本上本机构建gcc并创建一个静态链接库,以使我的gcc 4.5.3交叉编译器链接到该库。这似乎在很大程度上起作用。我使用以下命令在目标上创建库:

g++ -std=c++11 --static -c main2.cpp
ar -cvq libmain2.a main2.o

然后我复制文件并尝试使用gcc 4.5.3在主机上进行构建,并获得以下信息:

arm-angstrom-linux-gnueabi-g++ simple.cpp -lmain2 -L.

(我清理了一些输出)

对`std :: _ Hash_bytes(void const *,unsigned int,unsigned int)'的未定义引用 未定义的参考  std :: __ throw_regex_error(std :: regex_constants :: error_type)'

但是,当我使用nm时,会得到以下信息:

    $ arm-angstrom-linux-gnueabi-nm libmain2.a | grep Hash_bytes
     U _ZSt11_Hash_bytesPKvjj
     U _ZSt11_Hash_bytesPKvjj
    $ arm-angstrom-linux-gnueabi-nm libmain2.a | grep throw_regex
     U _ZSt19__throw_regex_errorNSt15regex_constants10error_typeE
     U _ZSt19__throw_regex_errorNSt15regex_constants10error_typeE

有人知道到底发生了什么吗?不幸的是,我们需要能够在主机系统上使用我们的交叉编译器来完成大多数工作,但是我们还需要集成使用c ++ 11的特定库。

还请注意,如果我从代码中删除了正则表达式和哈希功能,但保留了其他c ++ 11概念(如nullptr,类型推断,委托等),则代码可以正常编译并运行。

编辑:好的,因此,在进行更多调查之后,似乎函数_Hash_bytes和__throw_regex_error没有被静态链接到静态库中。我想我需要知道为什么要这样才能解决此问题。

0 个答案:

没有答案