在将 C 库从 Linux (Ubuntu) 移植到 OS X 时,链接器出现问题。C 代码是从 Matlab 自动生成的,所以理想情况下我不想更改代码本身。
问题似乎出在一个 C 文件中,该文件仅包含未初始化的变量声明,然后由其他 C 文件 EXTERNed 以实现 Matlab 算法。OS X 链接器显然无法识别此文件中的符号。相同的源代码在 Linux 上运行良好,因此我想了解 OS X 链接器的行为方式有何不同,以及是否可以将标志传递给它以更改行为。
静态库构建时没有错误/警告。但是在构建引用静态库的应用程序时,会抛出以下错误消息(在 OS X 上):
Undefined symbols for architecture x86_64:
"_my_var", referenced from:
_algorithm in libtestlibrary.a(algorithm.o)
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
'nm' 表明 libtestlibrary.a 确实包含符号 _my_var。
下面是来自 Matlab 的代码的简化版本。
库代码:
// DATA.C : declaration of data
#include "data.h"
int my_var;
// DATA.H - extern declaration of data
#ifndef H_DATA
#define H_DATA
extern int my_var;
#endif
// ALGORITHM.C - performs the calculation
#include "data.h"
int algorithm(int x) {
my_var += x;
return my_var;
}
//ALGORITHM.H - declaration of library API
#ifndef H_ALGORITHM
#define H_ALGORITHM
int algorithm(int x);
#endif
库构建命令:
gcc -c algorithm.c
gcc -c data.c
ar rcs libtestlibrary.a data.o algorithm.o
申请代码:
// MAIN.C : Code which calls into the static library
#include "algorithm.h"
int main() {
int x = 1;
x = algorithm(x);
return 0;
}
应用程序构建命令:
gcc -c main.c
gcc -o testapp main.o -ltestlibrary
如果我将 data.c 中的定义更改为“int my_var=0”,以便初始化变量,那么库和应用程序在 Linux 和 OS X 上都可以正确构建。但是,正如我上面所说,我不想要更改代码,因为它是从 Matlab 自动生成的。
在此先感谢您的帮助!