在库中包含带有 extern C 链接的函数

发布于 2024-11-16 07:54:06 字数 494 浏览 4 评论 0原文

我在 C++ 代码中包含了一些带有 extern c 链接的 C 函数。例如,

// File Y.cpp: 

extern C {  
 void fnA(void) { }  
 void fnB(void* a, void* b) { }  
}

class test {
....
};

// end of file

文件 Y 位于 Mod 模块下。在为模块 Mod 构建库 libMod-Oa 时,我没有看到包含 extern 块下的函数,除非 Yh 包含在其他文件(Mod.cpp)中并且使用了类测试。因此,除非我在 Mod.cpp 中创建测试类的对象,否则即使在 libMod-Oa 构建期间编译 Y.cpp,我也看不到 libMod-Oa 中的外部函数(fnA、fnB),其结果是当另一个模块使用 fnA、fnB 时,会发生链接器错误。

我没有看到 Mod.cpp 中包含的外部函数 fnA 和 fnB 以及类测试的使用之间的联系。这是预期的还是有更好的方法来定义它?

I have included some C functions with extern c linkage in c++ code. E.g.

// File Y.cpp: 

extern C {  
 void fnA(void) { }  
 void fnB(void* a, void* b) { }  
}

class test {
....
};

// end of file

File Y is under module Mod. While building library libMod-O.a for module Mod, I don't see the functions under extern block included, unless Y.h is included in some other file (Mod.cpp) and the class test is used. So unless I create an object of test class in Mod.cpp, I do not see the extern functions (fnA, fnB) in the libMod-O.a, even through Y.cpp is compiled during build of libMod-O.a. The result of this is that linker error happens as another module uses fnA, fnB.

I do not see the connection between the extern functions fnA and fnB being included and usage of class test in Mod.cpp. Is this expected or is there a better way to define this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

绮烟 2024-11-23 07:54:06

当然,你的意思是外部“C”。

您需要将 C 代码和 C++ 代码完全分开。

在 YourCCode.h 中:

#ifdef __cplusplus
extern "C" {
#endif

void fnA(void);
void fnB(void* a, void* b);

#ifdef __cplusplus
}
#endif

在 YourCCode.c 中:

void fnA(void) {}
void fnB(void* a, void* b) {}

确保编译器将 YourCCode.c 编译为 C,而不是 C++。

在你的 C++ 代码中

#include "YourCCode.h"

fnA();
// etc.

You mean extern "C" of course.

You need to have a clean separation between your C code and your C++ code.

In YourCCode.h:

#ifdef __cplusplus
extern "C" {
#endif

void fnA(void);
void fnB(void* a, void* b);

#ifdef __cplusplus
}
#endif

In YourCCode.c:

void fnA(void) {}
void fnB(void* a, void* b) {}

Make sure your compiler compiles YourCCode.c as C, not as C++.

In your C++ code

#include "YourCCode.h"

fnA();
// etc.
舞袖。长 2024-11-23 07:54:06

您可能会遇到链接顺序问题,其中使用 fnA 的文件位于 libMod-Oa 的链接之后,但带有对象测试的 Mod.cpp 位于 libMod-Oa 之前,因此在稍后需要 fnA/fnB 之前先拉入 obj 文件。默认情况下,gnu 链接器是单通道链接器。

you might have a link order problem where the files that use fnA come after the link of libMod-O.a but where Mod.cpp with object test comes before libMod-O.a so the obj file is pulled in before fnA/fnB are needed later. the gnu linker is a single pass linker by default.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文