In file included from jni/libvlcjni.c:31:0:
/home/aaa/1.4.x/vlc/include/vlc_common.h: In function
'vlc_memalign':
/home/aaa/1.4.x/vlc/include/vlc_common.h:825:5: warning:
implicit declaration of function 'posix_memalign'
[-Wimplicit-function-declaration]
jni/libvlcjni.c: In function
'Java_org_videolan_libvlc_LibVLC_getChapterDescription':
jni/libvlcjni.c:834:5: warning:
'libvlc_video_get_chapter_description' is deprecated (declared at
/home/aaa/1.4.x/vlc/include/vlc/libvlc_media_player.h:1276)
[-Wdeprecated-declarations]
[armeabi-v7a] SharedLibrary :
libvlcjni.so
/home/aaa/android/android-ndk-r10/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld:
/home/aaa/1.4.x/.modules/build-android-arm-linux-androideabi/libaccess_archive_plugin.a(libaccess_archive_plugin_la-archive.o):
in function
EnableArchiveFormats:../../modules/access/archive/archive.c:109:
error: undefined reference to
'archive_read_support_filter_lzma'
/home/aaa/android/android-ndk-r10/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld:
/home/aaa/1.4.x/.modules/build-android-arm-linux-androideabi/libaccess_archive_plugin.a(libaccess_archive_plugin_la-archive.o):
in function
EnableArchiveFormats:../../modules/access/archive/archive.c:109:
error: undefined reference to
'archive_read_support_filter_lzop'
/home/aaa/android/android-ndk-r10/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld:
/home/aaa/1.4.x/.modules/build-android-arm-linux-androideabi/libaccess_archive_plugin.a(libaccess_archive_plugin_la-archive.o):
in function
EnableArchiveFormats:../../modules/access/archive/archive.c:109:
error: undefined reference to
'archive_read_support_filter_none'
/home/aaa/android/android-ndk-r10/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld:
/home/aaa/1.4.x/.modules/build-android-arm-linux-androideabi/libaccess_archive_plugin.a(libaccess_archive_plugin_la-archive.o):
in function
EnableArchiveFormats:../../modules/access/archive/archive.c:109:
error: undefined reference to
'archive_read_support_filter_rpm'
/home/aaa/android/android-ndk-r10/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld:
/home/aaa/1.4.x/.modules/build-android-arm-linux-androideabi/libaccess_archive_plugin.a(libaccess_archive_plugin_la-archive.o):
in function
EnableArchiveFormats:../../modules/access/archive/archive.c:109:
error: undefined reference to
'archive_read_support_filter_uu'
/home/aaa/android/android-ndk-r10/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld:
/home/aaa/1.4.x/.modules/build-android-arm-linux-androideabi/libaccess_archive_plugin.a(libaccess_archive_plugin_la-archive.o):
in function
EnableArchiveFormats:../../modules/access/archive/archive.c:109:
error: undefined reference to
'archive_read_support_filter_xz'
/home/aaa/android/android-ndk-r10/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld:
/home/aaa/1.4.x/.modules/build-android-arm-linux-androideabi/libaccess_archive_plugin.a(libaccess_archive_plugin_la-archive.o):
in function
EnableArchiveFormats:../../modules/access/archive/archive.c:109:
error: undefined reference to
'archive_read_support_format_ar'
/home/aaa/android/android-ndk-r10/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld:
/home/aaa/1.4.x/.modules/build-android-arm-linux-androideabi/libaccess_archive_plugin.a(libaccess_archive_plugin_la-archive.o):
in function
EnableArchiveFormats:../../modules/access/archive/archive.c:109:
error: undefined reference to
'archive_read_support_format_cab'
/home/aaa/android/android-ndk-r10/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld:
/home/aaa/1.4.x/.modules/build-android-arm-linux-androideabi/libaccess_archive_plugin.a(libaccess_archive_plugin_la-archive.o):
in function
EnableArchiveFormats:../../modules/access/archive/archive.c:109:
error: undefined reference to
'archive_read_support_format_cpio'
/home/aaa/android/android-ndk-r10/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld:
/home/aaa/1.4.x/.modules/build-android-arm-linux-androideabi/libaccess_archive_plugin.a(libaccess_archive_plugin_la-archive.o):
in function
EnableArchiveFormats:../../modules/access/archive/archive.c:109:
error: undefined reference to
'archive_read_support_format_gnutar'
/home/aaa/android/android-ndk-r10/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld:
/home/aaa/1.4.x/.modules/build-android-arm-linux-androideabi/libaccess_archive_plugin.a(libaccess_archive_plugin_la-archive.o):
in function
EnableArchiveFormats:../../modules/access/archive/archive.c:109:
error: undefined reference to
'archive_read_support_format_lha'
/home/aaa/android/android-ndk-r10/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld:
/home/aaa/1.4.x/.modules/build-android-arm-linux-androideabi/libaccess_archive_plugin.a(libaccess_archive_plugin_la-archive.o):
in function
EnableArchiveFormats:../../modules/access/archive/archive.c:109:
error: undefined reference to
'archive_read_support_format_mtree'
/home/aaa/android/android-ndk-r10/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld:
/home/aaa/1.4.x/.modules/build-android-arm-linux-androideabi/libaccess_archive_plugin.a(libaccess_archive_plugin_la-archive.o):
in function
EnableArchiveFormats:../../modules/access/archive/archive.c:109:
error: undefined reference to
'archive_read_support_format_rar'
/home/aaa/android/android-ndk-r10/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld:
/home/aaa/1.4.x/.modules/build-android-arm-linux-androideabi/libaccess_archive_plugin.a(libaccess_archive_plugin_la-archive.o):
in function
EnableArchiveFormats:../../modules/access/archive/archive.c:109:
error: undefined reference to
'archive_read_support_format_raw'
/home/aaa/android/android-ndk-r10/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld:
/home/aaa/1.4.x/.modules/build-android-arm-linux-androideabi/libaccess_archive_plugin.a(libaccess_archive_plugin_la-archive.o):
in function
EnableArchiveFormats:../../modules/access/archive/archive.c:109:
error: undefined reference to
'archive_read_support_format_tar'
/home/aaa/android/android-ndk-r10/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld:
/home/aaa/1.4.x/.modules/build-android-arm-linux-androideabi/libaccess_archive_plugin.a(libaccess_archive_plugin_la-archive.o):
in function
EnableArchiveFormats:../../modules/access/archive/archive.c:109:
error: undefined reference to
'archive_read_support_format_xar'
collect2: ld returned 1 exit status
make: *** [jni/obj/local/armeabi-v7a/libvlcjni.so] Error
1
make: Leaving directory `/home/aaa/1.4.x/libvlc'
ndk-build failed
undefined reference to error解决方法
标签: referencemakefilegcc编译器deletelinux 2011-08-11 12:42
10398人阅读 评论(0) 收藏 举报 分类: linux(90)
作者同类文章X调试(48) 作者同类文章X
版权声明:本文为博主原创文章,未经博主允许不得转载。
Linux下编译,链接程序时,经常会遇到“undefined reference error”
报错,这种错误一般是在找不到相应的库文件的时候产生的。
下面是几个常见的问题(原理还不清楚,解释的也不专业,希望能解决一般问题)
1. undefined reference to `operator delete(void*)/‘new(void
*)’
在用gcc进行编译时,有时候会出现这样的问题。
改用g++编译可以解决这种链接错误。
2. undefined reference to
`pthread_create`
这种情况是由于pthread.h所在的库并不是默认的链接库,需要用" -l "来告诉编译器,去寻找对应的库
gcc -lpthread -o .o
.cpp
专业点的解释:使用了库中定义的实体,但没有指定库(-lXXX)或者没有指定库路径(-LYYY),会导致该错误,
3. main.cpp:(.text+0x281): undefined reference to
`CServer::getInstance()'
自己编写的程序包含多个类时,在最后编译成可执行文件的时候,要把所用到的类的
".o"文件包含,如果类之间有相互关系,则类之间的顺序也要注意。否则也会提示之类的错误。
例如:main函数包括class A, B, C,其中,B类变量是A类的成员变量之一
makefile文件写法(按照最保守的写法来,基本可以保证不是makefile文件的错,如果出错,在代码里找原因):
[plain] view plain copy print?main: main.o A.o B.o C.o
g++ -o main main.o A.o
B.o C.o
main.o: main.cpp
g++ -c -o main.o
main.cpp
A.o:A.cpp
g++ -c -o A.o A.cpp
B.o:B.cpp
g++ -c -o B.o B.cpp
C.o:C.cpp
g++ -c -o C.o C.cpp
main: main.o A.o B.o C.o
g++ -o main main.o A.o B.o C.o
main.o: main.cpp
g++ -c -o main.o main.cpp
A.o:A.cpp
g++ -c -o A.o A.cpp
B.o:B.cpp
g++ -c -o B.o B.cpp
C.o:C.cpp
g++ -c -o C.o
C.cpp注意:B写在A后,以便A要调用B链接好的文件时,可以找的到。
自己是新手,可能写的不简洁,但感觉这种写法比较保险。我自己做的时候成功了,不知道是否具有普遍适用性。
解释:
1. 在执行make的时候,第一句进行链接是先不执行的;
2. .o文件逐个编译,全部编译成功之后再用第一句链接成可执行文件。
下面是收集的点资料,以作补充。
博文1:http://forum.byr.edu.cn/pc/pccon.php?id=2620&nid=79318,应该比我的解释专业
吐舌头
Undefined reference to 错误:这类错误是在连接过程中出现的,可能有两种原因∶
一是使用者自己定义的函数或者全局变量所在源代码文件,没有被编译、连接,或者干脆还没有定义,这需要使用者根据实际情况修改源程序,给出全局变量或者函数的定义体;
二是未定义的符号是一个标准的库函数,在源程序中使用了该库函数,而连接过程中还没有给定相应的函数库的名称,或者是该档案库的目录名称有问题.
“undefined reference to
”一般是在找不到相应的库文件的时候产生的,也跟具体的makefile文件有关系。
另外,文中还提到了虚函数的问题。在定义有虚成员函数的类时,一定注意:
1. 虚构函数的函数体:" virtual func() { }
"。这种错误不会提示编译错误,而是提示各种莫名其妙的链接错误,也挺汗的。
2. 当含有虚函数的类未将析构函数声明为virtual时也会出现这种链接错误。
博文二:http://www.linuxdiyf.com/viewarticle.php?id=182131
undefined reference error错误的原因可能来自以下几方面:
1 没有指定对应的库(.o/.a/.so)
使用了库中定义的实体,但没有指定库(-lXXX)或者没有指定库路径(-LYYY),会导致该错误,
2 连接库参数的顺序不对
在默认情况下,对于-l
使用库的要求是越是基础的库越要写在后面,无论是静态还动态
3 gcc/ld 版本不匹配
gcc/ld的版本的兼容性问题,由于gcc2 到
gcc3大版本的兼容性存在问题(其实gcc3.2到3.4也一定程度上存在这样的问题)
当在高版本机器上使用低版本的机器就会导致这样的错误, 这个问题比较常见在32位的环境上,
另外就在32位环境不小心使用了64位的库或者反过来64位环境使用了32位的库.
4 C/C++相互依赖和链接
gcc和g++编译结果的混用需要保证能够extern "C"
两边都可以使用的接口,在我们的64位环境中gcc链接g++的库还需要加上 -lstdc++,具体见前文对于混合编译的说明
5 运行期报错
这个问题基本上是由于程序使用了dlopen方式载入.so,
但.so没有把所有需要的库都链接上,具体参加上文中对于静态库和动态库混合使用的说明
具体解决方法:从错误信息上看是libvlc/jni
少了库archrive,去到vlc/contrib\arm-linux-androideabi/lib看是否有对应的库,一般有libarchive.a
libarchive.la
找到后就是将库加入连接,打开 Android.mk
LOCAL_LDLIBS :=
-L$(VLC_CONTRIB)/lib \
$(VLC_MODULES) \
$(VLC_BUILD_DIR)/lib/.libs/libvlc.a \
$(VLC_BUILD_DIR)/src/.libs/libvlccore.a \
$(VLC_BUILD_DIR)/compat/.libs/libcompat.a
\
-larchive //添加
-ldl -lz -lm -llog \
-ldvbpsi -lebml -lmatroska -ltag \
-logg -lFLAC -ltheora -lvorbis \
-lmpeg2 -la52 \
-lavformat -lavcodec -lswscale -lavutil
-lpostproc -lgsm -lopenjpeg \
-lliveMedia -lUsageEnvironment
-lBasicUsageEnvironment -lgroupsock \
-lspeex -lspeexdsp \
-lxml2 -lpng -lgnutls -lgcrypt -lgpg-error
\
-lnettle -lhogweed -lgmp \
-lfreetype -liconv -lass -lfribidi -lopus
\
-lEGL -lGLESv2 -ljpeg \
$(CPP_STATIC)