繁体   English   中英

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

[英]How to link C++ to use variable defined in static C library (symbol not found error)

我有C静态库,其中定义了一个结构全局变量。 我希望在将链接到该C库的C ++代码中访问该变量。 目前,我收到“ ld:找不到体系结构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 -g library.a”并获得了“ 0000000000000008 C _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也会停止警告消息,因为该初始化程序是创建在库中运行的内容的原因(也就是说,您是正确的:警告对于您的问题重要)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM