静态库中定义的函数的“未定义引用”

时间:2012-12-13 10:07:08

标签: gcc shared-libraries static-libraries static-linking

我正在尝试构建一个在应用程序中使用的库。我按如下方式构建了库,当我编译应用程序时,我得到以下错误:

我做过beolw事情。

我用:

gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5) 

在要从应用程序调用的库中:

这里我有很多模块,但这个库的入口点是func() (即,main()被func()替换,以便我可以调用模块,func()也不会被声明为'static'。)

在其中一个档案中:

int func ();
...

int func () 
{ ... } 

然后将库构建为:

gcc -Wall file.c -o file.o
...
...

ar rvs libfun.a $(OBJS)

还在libfun.a上单独使用了ranlib和nm -s来构建符号表, 但是使用这些命令后存档的总大小没有变化,但仍然存在链接错误。 这里$(OBJS)包含所有目标文件

在应用程序中:

extern int func();

编译:

gcc -Wall -L./path-to-lib  -lfun  -o appl

然后我得到以下错误:

In function `main':
undefined reference to `func()'
collect2: ld returned 1 exit status

我尝试用“ar s”和“ranlib”构建符号表,但结果是一样的。

我观察到的一件事是我建立的“ar”的内容与其他模块的项目中已存在的档案存在差异。

我建立的档案包含(输出“nm -s libfun.a”):

Archive index:
Cfg1 in f1.o
mCfg1 in f1.o
dpCfg in f1.o

但我使用的其他档案没有任何变化包含以下奇怪的模式:

Archive index:
_Z29platformSetjP38tagTCPIP_INTERFACE_INSTANCE_ATTRIBUTES in platform.o
_Z27platformTestSetTcpjP20tagTCPIP_CONFIG_DATAPh in platform.o
_Z23platformSetTcpIpjP20tagTCPIP_CONFIG_DATA in platform.o

我不确定上面有什么区别。它是共享库还是静态库?

我正在尝试使用GCC编译并使用'ar'构建存档,但其他库文件可能正在使用g ++编译器。我不确定。以防万一。

在构建我的图书馆时,我在做错了什么?请帮帮忙?

问候。

2 个答案:

答案 0 :(得分:1)

我发现了错误的原因。 我正在将静态库与使用位置无关代码(PIC)和其他一些标志编译的其他库混合。添加这些标志解决了这个问题。

答案 1 :(得分:1)

另一个原因可能是-lxx的订单错误。

简而言之,将-lrelied放在-lrelying之后。

请参阅here