我正在将一个完全由“C”文件组成的静态库项目移植到iOS上,当我尝试在应用程序中使用该库时,我得到了一堆未定义的符号。
问题似乎是名字装饰。例如,假设我有这个功能:
unsigned int hello_world(int arg1, int arg2);
当我使用“nm”查看.a文件时,我看到以下内容:
对于实现该功能的file1.c:
0000002c T __Z10hello_worldii
对于调用函数的file2.c:
U __Z10hello_worldii
但是对于也调用该函数的file3.c而且该符号未定义我得到:
U _hello_world
所有三个 .c 文件都在库项目中。原型位于头文件中,file2.c和file3.c都包含该头文件。是 __ Z10 和 ii C ++名称装饰?如果是这样,为什么这些C文件被编译为C ++?
编辑:
Codo关于“编译源为”设置的问题促使我尝试将其从“根据文件类型”更改为“C”。这强制所有文件编译为“C”并解决了函数名称修改问题,但我仍然有42个未定义的符号,几乎都变成了变量。我注意到这些变量没有初始化器,所以我为其中一个添加了初始化器,当我重建使用该库的项目时,我只有3个未定义的符号。似乎只向变量添加一个初始化程序使链接器能够解析对该模块变量的所有引用。其余3个未定义的符号似乎是另一个问题。
EDIT2:
在剩下的3个错误中,1个是来自另一个模块的未初始化变量,2个是需要声明为静态的内联函数。