如何链接C++以使用静态C库中定义的变量(找不到符号错误)



我有一个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.hextern关键字的功能是专门用于停止这是一个(暂定(定义。在这种情况下,它可能是多余的,但最好包括它,因此确保在library.c中只有一个gs定义

library.c中包含initializer也会停止警告消息,因为该initializer创建了库中的东西(也就是说,你是正确的:警告对你的问题来说是重要的(。

最新更新