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

uplii1fm  于 2023-08-06  发布在  其他
关注(0)|答案(2)|浏览(162)

我正在尝试构建一个要在应用程序中使用的库。我构建了如下的库,当我编译应用程序时,我得到了下面的错误:
我已经做了最好的事情。
我用途:

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

字符串

在应用程序调用的Library中:

这里我有很多模块,但是这个库的入口点是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)包含所有的目标文件

应用中:

public int findDuplicate();
编译:

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++编译器。我不确定。以防万一。
我在建设图书馆的过程中做错了什么?请帮帮我?
问候。

zf9nrax1

zf9nrax11#

另一个原因可能是您的-lxx的顺序不正确。
简单地说,把-lrelied放在-lrelying之后。
参见here

vmpqdwk3

vmpqdwk32#

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

相关问题