【问题】
某人的编译出现以下问题:
arm-linux-gcc -O2 -I/usr/local/arm_linux_4.2//arm-linux/include -I/usr/local/arm_linux_4.2//arm-linux/sys-include -Wall --static -L/usr/local/arm_linux_4.2//lib/gcc/arm-linux/4.2.1 -L/usr/local/arm_linux_4.2//arm-linux/lib -L. vin_demo.c -o vin_demo -lc -lgcc -lc /tmp/ccUi1V0t.o: In function `ortp_message': vin_demo.c:(.text+0x38): undefined reference to `ortp_get_log_level_mask' vin_demo.c:(.text+0x6c): undefined reference to `ortp_logv_out' /tmp/ccUi1V0t.o: In function `main': vin_demo.c:(.text+0x138): undefined reference to `ortp_init' vin_demo.c:(.text+0x13c): undefined reference to `ortp_scheduler_init' vin_demo.c:(.text+0x144): undefined reference to `ortp_set_log_level_mask' vin_demo.c:(.text+0x14c): undefined reference to `rtp_session_new' vin_demo.c:(.text+0x158): undefined reference to `rtp_session_set_scheduling_mode' vin_demo.c:(.text+0x164): undefined reference to `rtp_session_set_blocking_mode' vin_demo.c:(.text+0x170): undefined reference to `rtp_session_set_connected_mode' vin_demo.c:(.text+0x188): undefined reference to `rtp_session_set_remote_addr' vin_demo.c:(.text+0x194): undefined reference to `rtp_session_set_payload_type' vin_demo.c:(.text+0x1c8): undefined reference to `rtp_session_set_ssrc' vin_demo.c:(.text+0x274): undefined reference to `rtp_session_send_with_ts' vin_demo.c:(.text+0x344): undefined reference to `rtp_session_destroy' vin_demo.c:(.text+0x348): undefined reference to `ortp_exit' vin_demo.c:(.text+0x34c): undefined reference to `ortp_global_stats_display' vin_demo.c:(.text+0x370): undefined reference to `rtp_session_make_time_distorsion' collect2: ld returned 1 exit status make: *** [all] Error 1 root@ubuntu:/home/wuguocai/wgcshare/W55FA92BSP2.6.35_VDP_141204/application/test_ortp#
makefile 配置如下:
.SUFFIXES : .x .o .c .s ROOT = /usr/local/arm_linux_4.2/ LIB = $(ROOT)/lib/gcc/arm-linux/4.2.1 LIB1 =$(ROOT)/arm-linux/lib INCSYS:=$(ROOT)/arm-linux/sys-include INC :=$(ROOT)/arm-linux/include #ROOT = #LIB = #LIB1 = #INCSYS:= . #INC := . CC=arm-linux-gcc -O2 -I$(INC) -I$(INCSYS) -Wall --static #CC=gcc -O2 -I$(INC) -I$(INCSYS) --static WEC_LDFLAGS=-L$(LIB) -L$(LIB1) -L. STRIP=arm-linux-strip #STRIP=strip TARGET = vin_demo SRCS := vin_demo.c LIBS= -lc -lgcc -lc -lpthread all: $(CC) $(WEC_LDFLAGS) $(SRCS) -o $(TARGET) $(LIBS) $(STRIP) $(TARGET) #cp $(TARGET) ../../rootfs-2.6.35/usr/. #cp $(TARGET) ../../initramfs/usr/. echo "Please copy execution file to storage" clean: rm -f *.o rm -f *.x rm -f *.flat rm -f *.map rm -f temp rm -f *.img rm -f $(TARGET) rm -f *.gdb rm -f *.bak
【解答过程】
1.从
vin_demo.c:(.text+0x38): undefined reference to `ortp_get_log_level_mask’
可以看出来是:
找不到函数ortp_get_log_level_mask
->需要你自己去找该函数所在的是什么库,然后需要加进来,这样编译时才能找到
->帮你去网上搜了:
undefined reference to ortp_get_log_level_mask
找到:
总的看起来,好像是:
to ortp_get_log_level_mask 应该是属于和ortp相关的库里面的。
->需要你自己去找到ortp相关的库,然后加进来,加到你的
LIBS= -lc -lgcc -lc -lpthread
里面。
这样应该就可以通过编译了。
2.我的ortp库已近安装在(makefile):
ROOT = /usr/local/arm_linux_4.2/ LIB1 =$(ROOT)/arm-linux/lib
我安装ortp库的配置命令:
root@ubuntu:/home/wuguocai/wgcshare/ortp-0.23.0# CC=arm-linux-gcc ./configure --prefix=/usr/local/arm_linux_4.2/arm-linux --host=arm-none-linux-gnueabi --target=arm-none-linux-gnueabi --disable-static
我今天发现用 gcc 编译可以通过。。。但是我用 arm-linux-gcc 编译就找不到库
3.(1)你虽然编译安装了ortp的库,但是你编译时,没有链接进去啊。
你链接时只看到:
-lc -lgcc -lc
没有类似的
-lortpxxxxx
之类的
所以肯定找不到。
(2)你把“gcc 编译可以通过”的详细log贴出来给我看看。
4.最新情况,我用arm-linux-gcc可以编译通过了。
root@ubuntu:/home/wuguocai/wgcshare/ortp-0.23.0/src/tests# arm-linux-gcc -Wall rtpsend.c -o ddddddddddddddd -lortp
但是,我把 -lortp放到 makefile 里还是提示找到不库文件,
root@ubuntu:/home/wuguocai/wgcshare/W55FA92BSP2.6.35_VDP_141204/application/test_ortp# make arm-linux-gcc -O2 -I/usr/local/arm_linux_4.2//arm-linux/include -I/usr/local/arm_linux_4.2//arm-linux/sys-include -L/usr/local/arm_linux_4.2//arm-none-linux-gnueabi/bin/ld/-lortp -Wall --static -L/usr/local/arm_linux_4.2//lib/gcc/arm-linux/4.2.1 -L/usr/local/arm_linux_4.2//arm-none-linux-gnueabi/lib -L/usr/local/arm_linux_4.2//arm-none-linux-gnueabi/bin/ld/-lortp -L. vin_demo.c -o vin_demo -lc -lgcc -lc -lortp -lpthread /usr/local/arm_linux_4.2/lib/gcc/arm-none-linux-gnueabi/4.2.1/../../../../arm-none-linux-gnueabi/bin/ld: cannot find -lortp
5.(1)可以用arm-linux-gcc编译通过了
那说明你的makefile里面的include路径(用-I添加的那些路径)中,的确包含了ortp所在的位置了。
(2)我把 -lortp放到 makefile 里还是提示找到不库文件
看起来有问题:
有问题啊
因为:
-Lxxx
其中的xxx,是一个路径,
而你这里的:
-L/usr/local/arm_linux_4.2//arm-none-linux-gnueabi/bin/ld/-lortp
中的xxx是:
-L/usr/local/arm_linux_4.2//arm-none-linux-gnueabi/bin/ld/-lortp
很明显不是一个路径
->很明显前半部分:
-L/usr/local/arm_linux_4.2//arm-none-linux-gnueabi/bin/ld/
(可能)是一个路径
而后半部分:
-lortp
明显是加进去的
导致上述路径有问题。
所以:
你是怎么把-lortp加到Makefile里面的???
把Makefile完整内容贴出来我看看。
(猜测你是中间少了空格了,导致前面的-L路径 和 -lortp连到一起,导致出错了。)
6.我的ortp库安装在:
root@ubuntu:/usr/local/arm_linux_4.2/arm-linux/lib# ls -l -rwxr-xr-x 1 root root 949 Jan 6 zz:zz:zz libortp.la lrwxrwxrwx 1 root root 16 Jan 6 zz:zz:zz libortp.so -> libortp.so.9.0.0 lrwxrwxrwx 1 root root 16 Jan 6 zz:zz:zz libortp.so.9 -> libortp.so.9.0.0 -rwxr-xr-x 1 root root 499818 Jan 6 zz:zz:zz libortp.so.9.0.0
我的makefile配置文件:
.SUFFIXES : .x .o .c .s ROOT = /usr/local/arm_linux_4.2/ LIB = $(ROOT)/lib/gcc/arm-linux/4.2.1 LIB1 = $(ROOT)/arm-none-linux-gnueabi/lib LIB2 = $(ROOT)/arm-none-linux-gnueabi/bin/ld/-lortp INCSYS:=$(ROOT)/arm-linux/sys-include INC :=$(ROOT)/arm-linux/include #ROOT = #LIB = #LIB1 = #INCSYS:= . #INC := . CC=arm-linux-gcc -O2 -I$(INC) -I$(INCSYS) -L$(LIB2) -Wall --static #CC=gcc -O2 -I$(INC) -I$(INCSYS) --static WEC_LDFLAGS=-L$(LIB) -L$(LIB1) -L$(LIB2) -L. STRIP=arm-linux-strip #STRIP=strip TARGET = vin_demo SRCS := vin_demo.c LIBS= -lc -lgcc -lc -lortp -lpthread all: $(CC) $(WEC_LDFLAGS) $(SRCS) -o $(TARGET) $(LIBS) $(STRIP) $(TARGET) #cp $(TARGET) ../../rootfs-2.6.35/usr/. #cp $(TARGET) ../../initramfs/usr/. echo "Please copy execution file to storage" clean: rm -f *.o rm -f *.x rm -f *.flat rm -f *.map rm -f temp rm -f *.img rm -f $(TARGET) rm -f *.gdb rm -f *.bak
7.
LIB2 = $(ROOT)/arm-none-linux-gnueabi/bin/ld/-lortp
很明显就是错误的:
先要明白的是:
Linux下面的编译的参数:
-Lxxx
-lxxx
的区别和含义:
-L,大写的L,后面的xxx,指的是:库函数的路径 -> -L/usr/lib 指的是:当编译程序的时候,搜索库的时候,去/usb/lib这个文件夹中搜索(所需要的库文件)
-l,小写的l,后面的xxx,指的是:库文件的文件名(的简写) -> -lortp 指的是:在编译搜索库的时候,需要搜索的(其中一个库文件)是libortp.so
所以,你的:
LIB2 = $(ROOT)/arm-none-linux-gnueabi/bin/ld/-lortp
对应着最终编译时的:
-L$(LIB2)
->
/usr/local/arm_linux_4.2//arm-none-linux-gnueabi/lib -L/usr/local/arm_linux_4.2//arm-none-linux-gnueabi/bin/ld/-lortp
明显就是一个无效的,非法的路径(文件夹)
而根据经验明显是:
/usr/local/arm_linux_4.2//arm-none-linux-gnueabi/lib -L/usr/local/arm_linux_4.2//arm-none-linux-gnueabi/bin/ld
是一个文件:ld链接程序文件
而后面的
/-lortp
更是无效的。
此处的路径明显是:
你想要添加-lortp,但是(不知所以的),随便乱(误)添加的
而导致你误添加到这里,是由于你此处的链接路径的变量,写的有问题:
此处的:
LIB2,被后面用到的是:
-L$(LIB2)
就意味着:
此处的LIB2,只是一个链接路径(文件夹)
和你写成LIB2的原意:一个库文件
违背了。
正确的,合理的做法应该是:
把LIB2改为,可以看出来是表示着,库文件路径,的名字
比如:
LIBINCLUDE
或
LIBINC
意味着library include==库文件所要包含的(搜索)路径
所以,此处的:
LIB = $(ROOT)/lib/gcc/arm-linux/4.2.1 LIB1 = $(ROOT)/arm-none-linux-gnueabi/lib LIB2 = $(ROOT)/arm-none-linux-gnueabi/bin/ld/-lortp WEC_LDFLAGS=-L$(LIB) -L$(LIB1) -L$(LIB2) -L.
应该改为:
LIBINC = $(ROOT)/lib/gcc/arm-linux/4.2.1 LIBINC1= $(ROOT)/arm-none-linux-gnueabi/lib LIBINC2 = $(ROOT)/arm-linux/lib WEC_LDFLAGS=-L$(LIBINC) -L$(LIBINC1) -L$(LIBINC2) -L.
会更易读懂,且是include了正确的路径。
8.你这句话说的非常正确(你想要添加-lortp,但是(不知所以的),随便乱(误)添加的)。。。谢谢你的指点。
ORTP就是一个通用库,本来安装就可以使用,但在我这偏偏不顺利,此问题已经弄了N天了,,呵呵。。。
你说的方法我已试过,但我怕我之前的有误,我还是拷贝你的代码重试了一遍。
makefile 文件:
.SUFFIXES : .x .o .c .s ROOT = /usr/local/arm_linux_4.2/ LIB = $(ROOT)/lib/gcc/arm-linux/4.2.1 LIB1 = $(ROOT)/arm-none-linux-gnueabi/lib LIB2 = $(ROOT)/arm-none-linux-gnueabi/bin/ld/-lortp INCSYS:=$(ROOT)/arm-linux/sys-include INC :=$(ROOT)/arm-linux/include LIBINC = $(ROOT)/lib/gcc/arm-linux/4.2.1 LIBINC1 = $(ROOT)/arm-none-linux-gnueabi/lib LIBINC2 = $(ROOT)/arm-linux/lib #ROOT = #LIB = #LIB1 = #INCSYS:= . #INC := . CC=arm-linux-gcc -O2 -I$(INC) -I$(INCSYS) -Wall --static #CC=gcc -O2 -I$(INC) -I$(INCSYS) --static #WEC_LDFLAGS=-L$(LIB) -L$(LIB1) -L$(LIB2) -L. WEC_LDFLAGS=-L$(LIBINC) -L$(LIBINC1) -L$(LIBINC2) -L. STRIP=arm-linux-strip #STRIP=strip TARGET = vin_demo SRCS := vin_demo.c LIBS= -lc -lgcc -lc -lpthread -lortp all: $(CC) $(WEC_LDFLAGS) $(SRCS) -o $(TARGET) $(LIBS) $(STRIP) $(TARGET) #cp $(TARGET) ../../rootfs-2.6.35/usr/. #cp $(TARGET) ../../initramfs/usr/. echo "Please copy execution file to storage" clean: rm -f *.o rm -f *.x rm -f *.flat rm -f *.map rm -f temp rm -f *.img rm -f $(TARGET) rm -f *.gdb rm -f *.bak
编译结果:
root@ubuntu:/home/wuguocai/wgcshare/W55FA92BSP2.6.35_VDP_141204/application/test_ortp# make arm-linux-gcc -O2 -I/usr/local/arm_linux_4.2//arm-linux/include -I/usr/local/arm_linux_4.2//arm-linux/sys-include -Wall --static -L/usr/local/arm_linux_4.2//lib/gcc/arm-linux/4.2.1 -L/usr/local/arm_linux_4.2//arm-none-linux-gnueabi/lib -L/usr/local/arm_linux_4.2//arm-linux/lib -L. vin_demo.c -o vin_demo -lc -lgcc -lc -lpthread -lortp /usr/local/arm_linux_4.2/lib/gcc/arm-none-linux-gnueabi/4.2.1/../../../../arm-none-linux-gnueabi/bin/ld: cannot find -lortp collect2: ld returned 1 exit status make: *** [all] Error 1 root@ubuntu:/home/wuguocai/wgcshare/W55FA92BSP2.6.35_VDP_141204/application/test_ortp#
9.从make的输出结果:
arm-linux-gcc -O2 -I/usr/local/arm_linux_4.2//arm-linux/include -I/usr/local/arm_linux_4.2//arm-linux/sys-include -Wall --static -L/usr/local/arm_linux_4.2//lib/gcc/arm-linux/4.2.1 -L/usr/local/arm_linux_4.2//arm-none-linux-gnueabi/lib -L/usr/local/arm_linux_4.2//arm-linux/lib -L. vin_demo.c -o vin_demo -lc -lgcc -lc -lpthread -lortp
可以看出,除了我之前说的错误,还有其他很多问题或者不太好的做法:
(1)
-I/usr/local/arm_linux_4.2//arm-linux/include
-I表示Include一个路径
此处参数是
/usr/local/arm_linux_4.2//arm-linux/include
但是标准的Linux下面的路径,中间是斜杠/,而不应该有两个斜杠//
所以,按道理来说应该是:
/usr/local/arm_linux_4.2/arm-linux/include
(1.1)不过,好像写成两个斜杠//,linux也是可以识别的。
但是最好不要这么写。
(1.2)不过Linux是否可以识别带两个斜杠的路径,你最好自己去验证一下:
用Linux里面的ls之类的命令,去测试看看这样写的路径是否可以被ls识别,比如:
ls /usr/local/arm_linux_4.2/arm-linux/include
比如可以正常执行,而不报无法识别此路径,那么说明这样写的确也是可以的。
(1.3)出现两个斜杠的问题的原因是:
定义一个路径时,最末尾你多写了个斜杠
即:
ROOT = /usr/local/arm_linux_4.2/
应该写成:
ROOT = /usr/local/arm_linux_4.2
才对。
这样后面的路径,就是:
/usr/local/arm_linux_4.2/
加上
arm-linux/include
就是正常的:
/usr/local/arm_linux_4.2/arm-linux/include
而不是:
/usr/local/arm_linux_4.2//arm-linux/include
了。
后续其他的,-I和-L后面的,带两个斜杠的路径,也是同样的问题。
(2)
(2.1)基于你之前已经去到目录:
/usr/local/arm_linux_4.2/arm-linux/lib
中ls可以列出来对应的ortp的库文件:
libortp.so
(2.2)且:
已经确保路径:
/usr/local/arm_linux_4.2//arm-linux/lib
是可以有效的,可以访问的,
后者已经改为了:
/usr/local/arm_linux_4.2/arm-linux/lib
的前提下:
如果还是找不到这个库文件:
有两种思路,去继续深入的研究此错误的原因:
(a)去确认库文件是否是此处所希望的arm平台的
去/usr/local/arm_linux_4.2/arm-linux/lib下,输入:
file libortp.so
可以得到输出结果,从中可以看出是针对arm的还是PC端x86平台的。
如果看不懂,贴出结果给我看。
(b)加入-v参数使得编译输出详细信息,以便分析编译的链接期间真正去搜索的库文件是什么
即,把:
CC=arm-linux-gcc -O2 -I$(INC) -I$(INCSYS) -Wall –static
换成:
CC=arm-linux-gcc -v -O2 -I$(INC) -I$(INCSYS) -Wall –static
然后看看make后的输出结果:
应该是输出很多信息,其中可以看出其搜索路径的详细过程
->以便分析错误的原因,是搜索库时搜索路径不存在的问题,还是搜索库文件的文件不存在的问题
另外,对于gcc的很多参数的含义,贴出我刚整理的,供参考:
关于gcc编译时的各种参数,gcc手册里面可以找到详细解释。
而关于gcc手册,网上就有很多:
GCC online documentation – GNU Project – Free Software Foundation (FSF)
->
比如4.9.2的:
Using the GNU Compiler Collection (GCC)
->
其中关于各种参数,这里有个概述:
Option Summary – Using the GNU Compiler Collection (GCC)
比如常见的:
include文件夹的:-I就属于:
“
Directory Options
See Options for Directory Search.
-Bprefix -Idir -iplugindir=dir
-iquotedir -Ldir -specs=file -I-
–sysroot=dir –no-sysroot-suffix
”
link库的:-l就属于:
“
Linker Options
See Options for Linking.
object-file-name -llibrary
-nostartfiles -nodefaultlibs -nostdlib -pie -rdynamic
-s -static -static-libgcc -static-libstdc++
-static-libasan -static-libtsan -static-liblsan -static-libubsan
-shared -shared-libgcc -symbolic
-T script -Wl,option -Xlinker option
-u symbol
”
10.感谢你耐心的解答,终于编译通过了。。。。。感谢 感谢 感谢。。。。。
root@ubuntu:/home/wuguocai/wgcshare/W55FA92BSP2.6.35_VDP_141204/application/test_ortp# make arm-linux-gcc -v -O2 -I/usr/local/arm_linux_4.2/arm-linux/include -I/usr/local/arm_linux_4.2/arm-linux/sys-include -Wall -L/usr/local/arm_linux_4.2/lib/gcc/arm-linux/4.2.1 -L/usr/local/arm_linux_4.2/arm-linux/lib -L. vin_demo.c -o vin_demo -lc -lgcc -lc -lpthread -lortp Using built-in specs. Target: arm-none-linux-gnueabi Configured with: ../../gcc-4.2.1/configure --prefix=/usr/local/arm_linux_4.2 --target=arm-none-linux-gnueabi --enable-languages=c,c++ --with-gnu-ld --with-gnu-as --disable-nls --with-float=soft --without-newlib --disable-libmudflap --disable-libssp --disable-libgomp Thread model: posix gcc version 4.2.1 /usr/local/arm_linux_4.2/libexec/gcc/arm-none-linux-gnueabi/4.2.1/cc1 -quiet -v -I/usr/local/arm_linux_4.2/arm-linux/include -I/usr/local/arm_linux_4.2/arm-linux/sys-include vin_demo.c -quiet -dumpbase vin_demo.c -mfloat-abi=soft -auxbase vin_demo -O2 -Wall -version -o /tmp/ccxcVNT2.s ignoring nonexistent directory "/usr/local/arm_linux_4.2/lib/gcc/arm-none-linux-gnueabi/4.2.1/../../../../arm-none-linux-gnueabi/sys-include" ignoring duplicate directory "/usr/local/arm_linux_4.2/arm-linux/include" as it is a non-system directory that duplicates a system directory ignoring nonexistent directory "/usr/local/arm_linux_4.2/arm-linux/sys-include" #include "..." search starts here: #include <...> search starts here: /usr/local/arm_linux_4.2/lib/gcc/arm-none-linux-gnueabi/4.2.1/include /usr/local/arm_linux_4.2/lib/gcc/arm-none-linux-gnueabi/4.2.1/../../../../arm-none-linux-gnueabi/include End of search list. GNU C version 4.2.1 (arm-none-linux-gnueabi) compiled by GNU C version 3.2 20020903 (Red Hat Linux 8.0 3.2-7). GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 Compiler executable checksum: c4267096e17e56c9b241c4fd25aab684 /usr/local/arm_linux_4.2/lib/gcc/arm-none-linux-gnueabi/4.2.1/../../../../arm-none-linux-gnueabi/bin/as -mfloat-abi=soft -meabi=4 -o /tmp/ccgwzW31.o /tmp/ccxcVNT2.s /usr/local/arm_linux_4.2/libexec/gcc/arm-none-linux-gnueabi/4.2.1/collect2 --eh-frame-hdr -dynamic-linker /lib/ld-linux.so.3 -X -m armelf_linux_eabi -o vin_demo /usr/local/arm_linux_4.2/lib/gcc/arm-none-linux-gnueabi/4.2.1/../../../../arm-none-linux-gnueabi/lib/crt1.o /usr/local/arm_linux_4.2/lib/gcc/arm-none-linux-gnueabi/4.2.1/../../../../arm-none-linux-gnueabi/lib/crti.o /usr/local/arm_linux_4.2/lib/gcc/arm-none-linux-gnueabi/4.2.1/crtbegin.o -L/usr/local/arm_linux_4.2/lib/gcc/arm-linux/4.2.1 -L/usr/local/arm_linux_4.2/arm-linux/lib -L. -L/usr/local/arm_linux_4.2/lib/gcc/arm-none-linux-gnueabi/4.2.1 -L/usr/local/arm_linux_4.2/lib/gcc/arm-none-linux-gnueabi/4.2.1/../../../../arm-none-linux-gnueabi/lib /tmp/ccgwzW31.o -lc -lgcc -lc -lpthread -lortp -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/local/arm_linux_4.2/lib/gcc/arm-none-linux-gnueabi/4.2.1/crtend.o /usr/local/arm_linux_4.2/lib/gcc/arm-none-linux-gnueabi/4.2.1/../../../../arm-none-linux-gnueabi/lib/crtn.o arm-linux-strip vin_demo #cp vin_demo ../../rootfs-2.6.35/usr/. #cp vin_demo ../../initramfs/usr/. echo "Please copy execution file to storage" Please copy execution file to storage root@ubuntu:/home/wuguocai/wgcshare/W55FA92BSP2.6.35_VDP_141204/application/test_ortp#
【总结】
想要折腾Linux下面的开发,还是需要多学习和掌握gcc的基本知识,包括gcc参数和编译链接的基本流程和逻辑,才能一步步的解决问题。
转载请注明:在路上 » 【记录】arm-linux-gcc编译ortp出错vin_demo.c:(.text+0x38): undefined reference to `ortp_get_log_level_mask’