我正在尝试构建一个在应用程序中使用的库。我如下构建了库,当我编译应用程序时,出现以下错误:
我已经做了以下事情。
I use:
gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
在从应用程序调用的库中:
这里我有很多模块,但是这个库的入口点是 func()
(即, main () 被替换为 func() 以便我可以调用该模块,并且 func () 没有声明为“静态”。)
在其中一个文件中:
int func ();
...
int func ()
{ ... }
然后将库构建为:
gcc -Wall file.c -o file.o
...
...
ar rvs libfun.a $(OBJS)
还分别在 libfun.a 上使用 ranlib 和 nm -s 来构建符号表,
但使用这些命令后,存档的总大小没有改变,并且仍然出现链接错误。
这里 $(OBJS) 包含所有目标文件
在应用中:
外部 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++ 编译器。我不知道。以防万一它很重要。
在构建我的图书馆时我做错了什么?请帮忙?
Regards.