[Ubuntu-zh] 请问编译gcc的时候怎么指定库文件目录

78 views
Skip to first unread message

chenchacha

unread,
Mar 6, 2012, 7:39:20 AM3/6/12
to ubuntu-zh@list
我是学电子的,平时用 arm-linux-gcc 交叉工具链。最近用 gcc-4.6.3 编译的
arm-none-linux-gnueabi 交叉工具链在编译Qt代码的时候出现了g++找不到库文件
的问题

arm-linux-g++ -lts -Wl,-O1
-Wl,-rpath,/usr/local/Trolltech/QtEmbedded-4.8.0-arm/lib -o movies
main.o movieplayer.o moc_movieplayer.o
-L/usr/local/Trolltech/QtEmbedded-4.8.0-arm/lib -lQtGui
-L/usr/local/trolltech/tslib/lib/
-L/usr/local/Trolltech/QtEmbedded-4.8.0-arm/lib -lQtNetwork -lQtCore
-lpthread
/usr/local/arm/4.6.3/lib/gcc/arm-none-linux-gnueabi/4.6.3/../../../../arm-none-linux-gnueabi/bin/ld: skipping incompatible /lib/libpthread.so.0 when searching for /lib/libpthread.so.0
/usr/local/arm/4.6.3/lib/gcc/arm-none-linux-gnueabi/4.6.3/../../../../arm-none-linux-gnueabi/bin/ld: cannot find /lib/libpthread.so.0
collect2: ld 返回 1
make: *** [movies] 错误 1

可以看到 arm-none-linux-gnueabi-g++ 跑到根目录 /lib 下面找寻找库文件
libpthread.so.0,而libpthread.so.0 和其他库是放在它自己的目录下面的。

我的 gcc 配置选项是
../configure --target=arm-none-linux-gnueabi \
--prefix=/usr/local/arm/4.6.2/ --enable-languages=c,c++ \
--disable-libgomp --with-cpu=arm920t --with-tune=arm9tdmi
--with-float=soft

配置选项只指定了安装目录,编辑器支持的语言和目标体系,去掉了编译会出错的
libgomp ,没有指定库文件目录。但是用 gcc 去编译 c 代码的时候是可以正常去
自己的库搜索,出问题的是 g++ ,也就是在编译 c++ 代码的时候 g++ 会去根目
录寻找系统库


--
ubuntu-zh mailing list
ubun...@lists.ubuntu.com
https://lists.ubuntu.com/mailman/listinfo/ubuntu-zh

sun

unread,
Mar 6, 2012, 8:14:32 AM3/6/12
to ubuntu-zh mailing lists
可以在编译之前 修改一下 PATH 变量 比如 PATH=“你交叉编译器的个目录,一般
就是../bin”:$PATH, 强制路径,先后顺序对了就可以了, 最本的办法就是 它哪
里找不到,你就把库复制一个过去也行,当然以后可能会有问题 ,最后就是自己
指定。

chenchacha

unread,
Mar 6, 2012, 9:01:27 AM3/6/12
to ubuntu-zh mailing lists
在 2012-03-06二的 21:14 +0800,sun写道:
呃,那个 PATH 路径之前就改了的。关于覆盖 /lib 的问题, 我的 lib 是编译完
整的 glibc, 覆盖系统 /lib 之后系统就别想动了。

这里补充一下工具链编译全过程:
首先是建立编译目录,建立在/usr/local/arm/4.6.3, 然后在该目录下建立编译工
具目录 build-tools 和 arm-none-linux-gnueabi 目录。

复制内核头文件目录 kernel/include/linux kernel/include/asm-generic
kernel/arch/arm/include/asm 到 arm-none-linux-gnueabi/include 下。

修改PATH变量,将 /usr/local/arm/4.6.3/bin 加进去。

编译过程是在 build-tools 目录下进行的,解压 binutils-2.22, gcc-4.6.3,
glibc-2.14.1 到该目录,glibc 目录加入 glibc-ports-2.14.1, 并给 glibc 打
上三个补丁:glibc-2.14.1-cpuid-1.patch, glibc-2.14.1-gcc_fix-1.patch,
glibc-2.14.1-fixes-1.patch


编译 binutils-2.22 的选项是:
../configure --target=arm-none-linux-gnueabi
--prefix=/usr/local/arm/4.6.3/

第一次编译 gcc 的选项是:
../configure --target=arm-none-linux-gnueabi \
--prefix=/usr/local/arm/4.6.3/ --without-headers --enable-language=c \
--disable-threads --with-newlib --disable-shared --disable-libmudflap \
--disable-libssp --with-cpu=arm9tdmi

编译 glibc 的选项是:
BUILD_CC="gcc" CC=arm-none-linux-gnueabi-gcc \
../configure --host=arm-none-linux-gnueabi \
--target=arm-none-linux-gnueabi \
--prefix=/usr/local/arm/4.6.3/arm-none-linux-gnueabi/ --enable-add-ons \
--disable-profile --with-binutils=/usr/local/arm/4.6.3/bin \
--with-headers=/usr/local/arm/4.6.3/arm-none-linux-gnueabi/include \
libc_cv_forced_unwind=yes libc_cv_c_cleanup=yes libc_cv_arm_tls=yes

编译 glibc 的时候报错,将 Makeconfig 第556行和561行的 -lgcc-eh 去掉编译
才通过。
glibc 编译完成后按网上的方法还修改了
arm-none-linux-gnueabi/lib/libc.so , 将 GROUP
( /lib/libc.so.6 /lib/libc_no nshared.a AS_NEEDED
( /lib/ld-linux.so.3 ) ) 改为 GROUP ( libc.so.6 libc_no nshared.a )

再次编译完整 gcc 的选项是:
../configure --target=arm-none-linux-gnueabi \
--prefix=/usr/local/arm/4.6.3/ --enable-languages=c,c++ \
--disable-libgomp --with-cpu=arm920t --with-tune=arm9tdmi
--with-float=soft

编译完成后将 /usr/local/arm/4.6.3/bin 下面的 arm-none-linux-gnueabi-* 复
制一份改名叫 arm-linux-* 并放回 bin 目录下, 其中 arm-linux-gcc
arm-linux-gcc-4.6.2 arm-linux-g++ 是三个脚本

arm-linux-gcc内容:
#!/bin/sh

exec arm-none-linux-gnueabi-gcc -march=armv4t $*

arm-linux-gcc-4.6.3的内容:
#!/bin/sh

exec arm-none-linux-gnueabi-gcc -march=armv4t $*

arm-linux-g++的内容:
#!/bin/sh

exec arm-none-linux-gnueabi-g++ -march=armv4t $*

整个编译链在编译 c 代码的时候正常使用,无论用不用库文件,我用这个工具链
编译了 busybox-1.19.3, wget-1.11.4,ncurses-5.9 用于测试,全部成功并能
运行。只有在编译 c++ 代码的时候会跑飞。

刘洋

unread,
Mar 6, 2012, 10:48:22 AM3/6/12
to ubun...@lists.ubuntu.com
-LPATH指定库文件所在路径,-llibname指定库名称,规则是libabc.so或者libabc.a的库用-labc来链接。

吴亚杰

unread,
Mar 6, 2012, 8:26:14 PM3/6/12
to ubun...@lists.ubuntu.com

你可以在/etc/ld.so.conf文件中加入你那个库的路径
再运行ldconfig。
这样在编译时就会去那个库的路径下查找

> Date: Tue, 6 Mar 2012 23:48:22 +0800
> From: aman...@gmail.com
> To: ubun...@lists.ubuntu.com
> Subject: Re: [Ubuntu-zh] 请问编译gcc的时候怎么指定库文件目录

-------------- 下一部分 --------------
一个HTML附件被移除...
URL: <https://lists.ubuntu.com/archives/ubuntu-zh/attachments/20120307/5e03a015/attachment.html>

hooxin firefoxmmx

unread,
Mar 6, 2012, 8:43:29 PM3/6/12
to ubuntu-zh mailing lists
临时的用-L路径 ,全局修改/etc/ld.so.conf 在ldconfig

URL: <https://lists.ubuntu.com/archives/ubuntu-zh/attachments/20120307/60d86955/attachment.html>

chenchacha

unread,
Mar 7, 2012, 1:40:02 AM3/7/12
to ubuntu-zh mailing lists
在 2012-03-07三的 09:43 +0800,hooxin firefoxmmx写道:

交叉工具链似乎没有去用系统的 ld.so.cache ,修改 ld.so.conf 并 ldconfig
照样编译出错

Qt 的 Makefile 自带 -LPATH ,所以加 -LPATH 不管用

这个工具链貌似在编译的时候就出错了,编译 gcc 本身的时候难道还有哪个参数
我没加?

Forest Chen

unread,
Mar 7, 2012, 2:23:34 AM3/7/12
to ubuntu-zh mailing lists
你把target指定成toolchains了。
你要在qmake.conf里指定toolchains 可考参以下两个连接。

http://processors.wiki.ti.com/index.php/Building_Qt
http://webkit.sed.hu/blog/20100427/qtwebkit-cross-compilation-gcc-arm-linux

chenchacha

unread,
Mar 7, 2012, 2:39:24 AM3/7/12
to ubuntu-zh mailing lists
在 2012-03-07三的 15:23 +0800,Forest Chen写道:
并非是只对 qt 出错,编译其他 c++ 代码的时候也会遇上 g++ 乱找库的情况。况
且 qt 本身应该没有问题,之前我用别人编译的 arm-linux-gcc 4.3.3 编译 qt
程序能够成功

chenchacha

unread,
Mar 7, 2012, 4:18:59 AM3/7/12
to ubuntu-zh mailing lists
在 2012-03-07三的 15:23 +0800,Forest Chen写道:
感谢大家回复,今天我又把之前的 gcc 全部推倒,重新编译

下午的时候发现了问题所在,不在 gcc 和 glibc 上,是 binutils 出了问题,
binuitls 的参数应该是这样:
../configure --target=arm-none-linux-gnueabi \
--prefix=/usr/local/arm/4.6.3/ \
--with-sysroot=/usr/local/arm/4.6.3/arm-none-linux-gnueabi/

指定了一个根目录。我以前还以为 --with-sysroot 这个参数是 gcc 给交叉编译
专门设的,原来 bintuils 也有

链接工具重新指定了根目录之后,就不会跑到系统库下面去寻找了。倒是之前只有
g++ 出问题,gcc 依然能正常使用的情况,倒是变得有些莫名其妙起来。明明没有
指定库目录,gcc 居然可以找到正确的库文件,让人费解

Reply all
Reply to author
Forward
0 new messages