我想覆盖/清除库的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
只是强制我手动指定库,但它仍保留搜索路径。
当然我可以使用另一个工具链/编译我自己的工具链,但我更愿意留在打包的工具链上。