在库中包含带有 extern C 链接的函数
我在 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
当然,你的意思是外部“C”。
您需要将 C 代码和 C++ 代码完全分开。
在 YourCCode.h 中:
在 YourCCode.c 中:
确保编译器将 YourCCode.c 编译为 C,而不是 C++。
在你的 C++ 代码中
You mean extern "C" of course.
You need to have a clean separation between your C code and your C++ code.
In YourCCode.h:
In YourCCode.c:
Make sure your compiler compiles YourCCode.c as C, not as C++.
In your C++ code
您可能会遇到链接顺序问题,其中使用 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.