覆盖/清除库的g ++默认搜索路径

时间:2017-10-30 16:57:04

标签: linux cmake g++ cross-platform

问题

我想覆盖/清除库的g ++默认搜索路径,以便g ++只搜索明确指定的路径下的库:

$ arm-linux-gnueabihf-g++ --print-search-dirs | grep libraries:
libraries: =/usr/lib/gcc-cross/arm-linux-gnueabihf/6/:/usr/lib/gcc-cross/arm-lin
ux-gnueabihf/6/../../../../arm-linux-gnueabihf/lib/arm-linux-gnueabihf/6/:/usr/l
ib/gcc-cross/arm-linux-gnueabihf/6/../../../../arm-linux-gnueabihf/lib/arm-linux
-gnueabihf/:/usr/lib/gcc-cross/arm-linux-gnueabihf/6/../../../../arm-linux-gnuea
bihf/lib/../lib/:/lib/arm-linux-gnueabihf/6/:/lib/arm-linux-gnueabihf/:/lib/../l
ib/:/usr/lib/arm-linux-gnueabihf/6/:/usr/lib/arm-linux-gnueabihf/:/usr/lib/../li
b/:/usr/lib/gcc-cross/arm-linux-gnueabihf/6/../../../../arm-linux-gnueabihf/lib/
:/lib/:/usr/lib/

可以这样做吗?

背景

我正在使用Ubuntu 17.04编译几个跨平台发行版的c ++代码。

我已经安装了Ubuntu g++-arm-linux-gnueabihf包,并在/ opt / jessie_root下创建了一个目标图像,在本例中为Jessie armhf。我还修复了这个jessie_root图像下的所有链接是相对的而不是绝对的。

我想用目标rootfs库编译动态可执行文件。

最初我正在编译“很好”,但我意识到我正在链接到主机交叉工具链libstdc ++上的符号。

我正在使用cmake,但为简单起见,请考虑以下命令:

/usr/bin/arm-linux-gnueabihf-g++ main.c

这将链接到/usr/lib/gcc-cross/arm-linux-gnueabihf/6/libstdc++.so下的主机libstdc ++,这是不可取的

/usr/bin/arm-linux-gnueabihf-g++ main.cpp --sysroot=/opt/jessie_root -L=/usr/lib/gcc/arm-linux-gnueabihf/4.9 -D_GLIBCXX_USE_CXX11_ABI=0

这将正确链接到我想要的/opt/jessie_root/usr/lib/gcc/arm-linux-gnueabihf/4.9/libstdc++.so下的目标libstdc ++。

问题是,这似乎是一场等待发生的灾难,好像在目标上找不到其中一个默认的lib,编译器将从主机交叉工具链中拿出一个。

我可以删除或重命名它们,但我不想弄乱/ usr /.

我还玩过GCC -nostdlib和LD -nostdlib,它们似乎有不同的含义。 GCC -nostdlib用于库,LD -nostdlib用于搜索目录。 LD -nostdlib没有效果,GCC -nostdlib只是强制我手动指定库,但它仍保留搜索路径。

当然我可以使用另一个工具链/编译我自己的工具链,但我更愿意留在打包的工具链上。

0 个答案:

没有答案