我有一个C静态库,其中定义了一个结构全局变量。我希望访问将链接到该C库的C++代码中的该变量。目前,我收到"ld:symbol not found for architecture x86_64"错误。
我正在尝试以下(为了问题起见,简化了结构(:
// library.h
#ifdef __cplusplus
extern "C" {
#endif
typedef struct {
int simpleVariableA;
int simpleVariableB;
} GlobalStruct;
extern GlobalStruct gs;
#ifdef __cplusplus
}
#endif
// library.c
#include "library.h"
GlobalStruct gs;
Library.c和Library.h被编译成Library.a,一个静态链接的库。然后,我想将C++文件链接到库,但会出现错误。
// main.cpp
#include "library.h"
int main(int argc, char** argv) {
gs.simpleVariableA = 1;
gs.simpleVariableB = 1;
}
我做错了什么?我已经运行了"nm-glibrary.a",并返回了"0000000000000008C_gs",所以我认为这意味着符号正在导出,不是吗?C++找不到C代码是问题吗?
我编译的文件是这样的:
gcc -c library.c -o library.o
ar rcs liblibrary.a library.o
g++ main.cpp -L. -llibrary
顺便说一句,我收到一个ar命令错误:
warning: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: warning for library: liblibrary.a the table of contents is empty (no object file members in the library define global symbols)
但是,如果我在library.h和library.c中定义了一个函数f((并将其编译到库中,那么这个错误就会消失。
每次提到gs
都只是一个声明(也就是说,它表明在的某个地方有一个名为的东西(,但它们都不是定义。
如果你在library.c
中初始化gs
,你的问题就会消失:
GlobalStruct gs = { 0, 0 };
library.h
中extern
关键字的功能是专门用于停止这是一个(暂定(定义。在这种情况下,它可能是多余的,但最好包括它,因此确保在library.c
中只有一个gs
的定义。
在library.c
中包含initializer也会停止警告消息,因为该initializer创建了库中的东西(也就是说,你是正确的:警告对你的问题来说是重要的(。