静态库的未定义引用和奇怪的内容

Posted

技术标签:

【中文标题】静态库的未定义引用和奇怪的内容【英文标题】:undefined reference and strange content of static library 【发布时间】:2010-06-16 16:51:20 【问题描述】:

嘿,我是真正的 gcc 新手,如果这是一个愚蠢的问题,请原谅。

我想在 android 中使用 opencv,因此尝试将其编译成一个静态库,该库在 android ndk 构建过程中使用,以构建一个我打算用于我的 android 应用程序的共享库。 statc 库的构建工作正常,但是在构建共享库时,我收到有关未定义引用的投诉。由于该文件似乎已正确编译并包含在内,我使用 ar -tv 检查并查看以下内容:

---------       0/0         27304 Jun 16 18:15 2010 /  
---------       0/0            24 Jan  1 01:00 1970 //  
rw-r--r--     501/501       11192 Jun 16 18:13 2010 cxalloc.o/  
rw-r--r--     501/501      289760 Jun 16 18:13 2010 cxarithm.o/  
rw-r--r--     501/501      197368 Jun 16 18:13 2010 cxarray.o/  
rw-r--r--     501/501      335112 Jun 16 18:13 2010 cxcmp.o/  
rw-r--r--     501/501      422872 Jun 16 18:13 2010 cxconvert.o/  
rw-r--r--     501/501      127160 Jun 16 18:13 2010 cxcopy.o/  
rw-r--r--     501/501      191208 Jun 16 18:13 2010 cxdatastructs.o/  
rw-r--r--     501/501      141536 Jun 16 18:13 2010 cxdrawing.o/  
rw-r--r--     501/501      170936 Jun 16 18:13 2010 cxdxt.o/  
rw-r--r--     501/501       29008 Jun 16 18:13 2010 cxerror.o/  
rw-r--r--     501/501       48304 Jun 16 18:13 2010 cximage.o/  
rw-r--r--     501/501       23376 Jun 16 18:13 2010 /0  
rw-r--r--     501/501       61024 Jun 16 18:13 2010 cxlogic.o/  
rw-r--r--     501/501       39520 Jun 16 18:13 2010 cxlut.o/  
rw-r--r--     501/501      122064 Jun 16 18:14 2010 cxmathfuncs.o/  
rw-r--r--     501/501      600368 Jun 16 18:14 2010 cxmatmul.o/  
rw-r--r--     501/501      135824 Jun 16 18:14 2010 cxmatrix.o/  
rw-r--r--     501/501      140464 Jun 16 18:14 2010 cxmean.o/  
rw-r--r--     501/501      339224 Jun 16 18:14 2010 cxmeansdv.o/  
rw-r--r--     501/501      118208 Jun 16 18:14 2010 cxminmaxloc.o/  
rw-r--r--     501/501      497760 Jun 16 18:14 2010 cxnorm.o/  
rw-r--r--     501/501      119712 Jun 16 18:14 2010 cxouttext.o/  
rw-r--r--     501/501      346624 Jun 16 18:14 2010 cxpersistence.o/  
rw-r--r--     501/501        1688 Jun 16 18:14 2010 cxprecomp.o/  
rw-r--r--     501/501       86856 Jun 16 18:14 2010 cxrand.o/  
rw-r--r--     501/501      242768 Jun 16 18:15 2010 cxsumpixels.o/  
rw-r--r--     501/501       82320 Jun 16 18:15 2010 cxsvd.o/  
rw-r--r--     501/501      102024 Jun 16 18:15 2010 cxswitcher.o/  
rw-r--r--     501/501        5968 Jun 16 18:15 2010 cxtables.o/  
rw-r--r--     501/501       43720 Jun 16 18:15 2010 cxutils.o/  

有两行我不明白,第二行的日期为 1970,另一行的文件名为 \0。我也想知道,因为 nm 没有返回任何东西。当我尝试使用 randlib 时,我得到:

ranlib: warning for library: libcxcore.a the table of contents is empty (no object file members in the library define global symbols)  

应该在\0处出现的文件是定义了不能被引用的函数之一的文件。

我在 OS X 10.6 和 Ubuntu 10.04 下试过这个。

对此有何见解或我还能做些什么来找出问题?

【问题讨论】:

【参考方案1】:

也许你用来创建静态库的命令是错误的?您应该使用“ar -rs”。 “s”选项创建一个索引表。那可能是你的问题?

【讨论】:

原来它在 ubuntu 中工作,不知道 os x 中的问题是什么

以上是关于静态库的未定义引用和奇怪的内容的主要内容,如果未能解决你的问题,请参考以下文章

在库的情况下对函数的未定义引用

在 iOS 中使用静态库的“架构 i386 的未定义符号”

对静态成员的未定义引用

声明和定义函数静态会产生“对 function_name() 的未定义引用”

对静态 constexpr 数据成员的未定义引用错误

c++中对静态变量的未定义引用