在与我的 C++ 相同的 Visual Studio 解决方案中从 C 项目(共享库)调用 C 函数类给出链接器错误

发布于 2024-12-09 14:28:19 字数 1162 浏览 0 评论 0原文

我收到链接错误

错误 LNK2028:无法解析的标记(0A000018)“extern "C" void __clrcall MyCFunction(struct ud *)" (?MyCFunction@@$J0YMXPAUud@@@Z) 在函数“public: __clrcall MyCPPProj::MyClass: 中引用:我的班级

错误 LNK2019:函数“public: __clrcall MyCPPProj::MyClass::MyClass”中引用了无法解析的外部符号“extern "C" void __clrcall MyCFunction(struct ud *)" (?MyCFunction@@$$J0YMXPAUud@@@Z)

当我尝试从 C++ 类调用 C 静态库中的函数时。

这是我的库的标头的开始方式:

#ifdef __cplusplus
extern "C" {
#endif
#include <stdio.h>
#include "types.h"
extern void MyCFunction(struct myCStruct*);

这是标头实现的一个片段:

extern void
MyCFunction(struct myCStruct* cStrInst)
{
    //Do stuff
}

这就是我的调用方式:

#include "MyCLib.h"
MyClass::MyClass() {
    myCStruct myCObj;
    MyCFunction(&myCObj);
    //More to follow...
}

有人知道我哪里出错了吗?我能找到的所有建议似乎都已实现,即使用 extern "C" { 包装器声明整个标头(http://www.parashift.com/c++-faq-lite/mixing- c-and-cpp.html)。

编辑 我尝试使 C 库更加符合 C++ 规范,并将其包含为 C++ 和 C,但结果相同:LNK2028 和 LNK2019 链接器错误。我将其设为静态库,因为项目需要有一个类型,并且在将其添加到我的解决方案之前我需要看到它单独编译。

I am getting linking errors

error LNK2028: unresolved token (0A000018) "extern "C" void __clrcall MyCFunction(struct ud *)" (?MyCFunction@@$$J0YMXPAUud@@@Z) referenced in function "public: __clrcall MyCPPProj::MyClass::MyClass

error LNK2019: unresolved external symbol "extern "C" void __clrcall MyCFunction(struct ud *)" (?MyCFunction@@$$J0YMXPAUud@@@Z) referenced in function "public: __clrcall MyCPPProj::MyClass::MyClass

When I try to call functions in my C static library from a C++ class.

Here is how my library's header begins:

#ifdef __cplusplus
extern "C" {
#endif
#include <stdio.h>
#include "types.h"
extern void MyCFunction(struct myCStruct*);

Here is a snippet from the header's implementation:

extern void
MyCFunction(struct myCStruct* cStrInst)
{
    //Do stuff
}

and this is how I am calling it:

#include "MyCLib.h"
MyClass::MyClass() {
    myCStruct myCObj;
    MyCFunction(&myCObj);
    //More to follow...
}

Any one know where I am going wrong? All the advice I can find seems to have already been implemented, i.e. declaring whole header with extern "C" { wrapper (http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html).

EDIT
I've tried making the C library more C++ compliant and included it as C++ and C with the same result: LNK2028 and LNK2019 linker errors. I made it a static library because projects need to have a type and I needed to see it compile in isolation before adding it to my solution.

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

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

发布评论

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

评论(2

疑心病 2024-12-16 14:28:19

对于实现(在 .cpp 文件中),您需要像这样放置 extern "C":

extern "C" void MyCFunction(struct myCStruct* cStrInst)

以使编译器为类似 C 的链接生成正确的符号名称。

For the implementation (in a .cpp-file) you need to put extern "C" like this:

extern "C" void MyCFunction(struct myCStruct* cStrInst)

to make the compiler produce the right symbol-name for a C-like-link.

北城孤痞 2024-12-16 14:28:19

作为初步但正确的答案,我发现将 Form 添加到原始本机 C 库项目(在其自己的解决方案中 - VS 发出关于转换我刚刚接受的项目的警告),确保所有文件都是 C++(更改后缀并显式转换)允许我链接到并调用之前中断的函数。什么是另一项重构?

所以我很高兴第一个功能能够正常工作。向前、向上!

更新 在某个地方,我再次收到 LNK2001 和 LNK2019 错误。这次涉及第三方代码。修复非常简单(重复的声明替换了 #pragma 一次 #include),而且原始编译器很可能不会接受。

现在一切都很好地结合在一起。虽然如果我不能使用我的原始源代码,我有一个替代的 LGPL / BSD 解决方案:D

As a preliminary, though correct answer, I have found that adding a Form to the original native C library project (in its own solution - VS mutters a warning about converting the project which I just accepted), and ensuring all files are C++ (change suffix and explicitly casting) allows me to link to and call the function that was previously breaking. What's one more refactorisation?

So I'm happy with getting that first function to work. Onwards and upwards!

UPDATE Somewhere along the lines I was getting LNK2001 and LNK2019 errors again. This time relating to third party code. The fix was suprisingly easy (duplicate declaration replaced #pragma once #include) and prolly not picked up by the original compiler.

It all works great together now. Though I had an alternative LGPL / BSD solution if I couldn't use my original source :D

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