我正在将一个完全由“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 个未定义符号似乎是另一个问题。
编辑2:
在剩下的 3 个错误中,1 个是来自另一个模块的未初始化变量,2 个是需要声明为静态的内联函数。