Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何链接C++;使用静态C库中定义的变量(未找到符号错误)_C++_C_Static Libraries - Fatal编程技术网

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

C++ 如何链接C++;使用静态C库中定义的变量(未找到符号错误),c++,c,static-libraries,C++,C,Static Libraries,我有一个C静态库,其中定义了一个struct全局变量。我希望访问C++代码中的那个变量,它将链接到C库。目前,我发现“ld:symbol(s)not found for architecture x86_64”错误 我正在尝试以下方法(为了回答这个问题而简化结构): Library.c和Library.h被编译成Library.a,一个静态链接的库。然后我想将C++文件链接到库,但会得到错误。 // main.cpp #include "library.h" int main(int argc

我有一个C静态库,其中定义了一个struct全局变量。我希望访问C++代码中的那个变量,它将链接到C库。目前,我发现“ld:symbol(s)not found for architecture x86_64”错误

我正在尝试以下方法(为了回答这个问题而简化结构):

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”并得到了“0000000000008 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 };
您的
库.h
中的
extern
关键字的功能是专门阻止这是一个(暂定)定义。在这种情况下,它可能是多余的,但最好包含它,因此确保
library.c
中只有一个
gs
的定义


将初始化器包含在
library.c
中也会停止警告消息,因为初始化器创建了库中的东西(也就是说,您是正确的:警告对您的问题很重要)。

您提到的
gs
只是一个声明(也就是说,它表示某个地方有一个同名的东西),但没有一个是定义(这是另外为命名的东西留出空间的东西)

如果您在
library.c
中初始化
gs
,您的问题就会消失:

GlobalStruct gs = { 0, 0 };
您的
库.h
中的
extern
关键字的功能是专门阻止这是一个(暂定)定义。在这种情况下,它可能是多余的,但最好包含它,因此确保
library.c
中只有一个
gs
的定义


将初始化器包含在
library.c
中也会停止警告消息,因为初始化器创建了库中的东西(也就是说,您是正确的:警告对您的问题很重要)。

您提到的
gs
只是一个声明(也就是说,它表示某个地方有一个同名的东西),但没有一个是定义(这是另外为命名的东西留出空间的东西)

如果您在
library.c
中初始化
gs
,您的问题就会消失:

GlobalStruct gs = { 0, 0 };
您的
库.h
中的
extern
关键字的功能是专门阻止这是一个(暂定)定义。在这种情况下,它可能是多余的,但最好包含它,因此确保
library.c
中只有一个
gs
的定义


将初始化器包含在
library.c
中也会停止警告消息,因为初始化器创建了库中的东西(也就是说,您是正确的:警告对您的问题很重要)。

您提到的
gs
只是一个声明(也就是说,它表示某个地方有一个同名的东西),但没有一个是定义(这是另外为命名的东西留出空间的东西)

如果您在
library.c
中初始化
gs
,您的问题就会消失:

GlobalStruct gs = { 0, 0 };
您的
库.h
中的
extern
关键字的功能是专门阻止这是一个(暂定)定义。在这种情况下,它可能是多余的,但最好包含它,因此确保
library.c
中只有一个
gs
的定义


将初始化器包含在
library.c
中也会停止警告消息,因为该初始化器创建了库中的内容(也就是说,您是正确的:警告对您的问题很重要).

Hmm至少是一个警告:/…Hmm至少是一个警告:/…Hmm至少是一个警告:/…Hmm至少是一个警告:/…非常感谢。我没有意识到不将变量设置为初始值意味着它实际上没有正确定义,我原以为在.c文件中提到它意味着它已经完全定义好了re的关于声明和定义的更多信息非常好,非常感谢。我对定义的混淆是基于这样一个事实,如果你把“Globalstruct gs在.cpp文件中,所以我一直认为这是一个足够的定义。非常好,谢谢。我没有意识到不将变量设置为初始值意味着它实际上没有正确定义,我认为在.c文件中提到它意味着它已经完全定义。还有关于声明和定义的更多信息非常好,非常感谢。我对定义的混淆是基于这样一个事实:如果你把“Globalstruct gs在.cpp文件中,所以我一直认为这是一个足够的定义。非常好,谢谢。我没有意识到不将变量设置为初始值意味着它实际上没有正确定义,我认为在.c文件中提到它意味着它已经完全定义。还有关于声明和定义的更多信息在V中