[英]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.