libvlc静态库Linux,vlc编译错误 undefined reference to

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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值