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

Ash*_*a K 7 gcc shared-libraries static-libraries static-linking

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

我已经完成了以下事情。

我用:

gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5) 
Run Code Online (Sandbox Code Playgroud)

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

在这里我有很多模块,但是这个库的入口点是 func() (即 main () 被替换为 func() 以便我可以调用模块,并且 func () 也没有声明为“静态”。)

在其中一个文件中:

int func ();
...

int func () 
{ ... } 
Run Code Online (Sandbox Code Playgroud)

然后将库构建为:

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

ar rvs libfun.a $(OBJS)
Run Code Online (Sandbox Code Playgroud)

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

在应用中:

extern int func();

编译:

gcc -Wall -L./path-to-lib  -lfun  -o appl
Run Code Online (Sandbox Code Playgroud)

然后我收到以下错误:

In function `main':
undefined reference to `func()'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

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

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

我构建的存档包含(输出为 "nm -s libfun.a" ):

Archive index:
Cfg1 in f1.o
mCfg1 in f1.o
dpCfg in f1.o
Run Code Online (Sandbox Code Playgroud)

但是我在没有任何更改的情况下使用的其他档案包含以下奇怪的模式:

Archive index:
_Z29platformSetjP38tagTCPIP_INTERFACE_INSTANCE_ATTRIBUTES in platform.o
_Z27platformTestSetTcpjP20tagTCPIP_CONFIG_DATAPh in platform.o
_Z23platformSetTcpIpjP20tagTCPIP_CONFIG_DATA in platform.o
Run Code Online (Sandbox Code Playgroud)

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

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

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

问候。

Ash*_*a K 1

我找到了错误的原因。我将静态库与使用位置无关代码(PIC)和其他一些标志编译的其他库混合在一起。添加“-fPIC”标志解决了该问题。