c++ - extern "C"在已编译的目标代码中运行

标签 c++ extern-c

环境是 Microsoft Visual C++ 2015 和 Windows 7。

在 header 中定义的 inline extern "C" 函数有什么特别之处吗?我正在使用一个 SDK,其中一个 header 包含这样一个野兽。在我的应用程序中,我有一个单独的 TU(翻译单元),它一生中唯一的工作就是包含上述标题。就这样。里面没有别的东西。如果我深入研究生成的目标文件,我会看到 extern "C" 函数被引入。这会导致一些不需要的副作用(我暂时不考虑它们是什么,因为它可能只是分散主要问题)。

为什么会这样?客户端代码中没有任何内容(请记住,除了 main() 入口点和该 header 之外,我唯一的 TU 是空的)会触发这种情况。

UPDATE 用一个小片段可以更好地解释我遇到的问题:

这是实际发生的事情:

FooObj.h

FooObj::FooObj() { }

FooObj::~FooObj() { CallIntoAnotherC_API(); }

SDKHeader.h

#include <FooObj.h>

extern "C" inline void SomeFunc(void* user_data)
{   
    A* obj = static_cast<A*>(user_data);
    obj->CallAnotherFunc(FooObj(33));
}

我的文件.cpp

#include "SDKHeader.h"

int main() { return 0; }

将 MyFile.cpp 编译成可执行文件失败,链接器报错 CallIntoAnotherC_API 是一个未解析的外部。

最佳答案

乔纳森莱弗勒!非常感谢您为我指明了正确的方向。我发现了问题所在,至少可以说它非常奇怪。在我上面发布的 SDKHeader.h 片段中,有一个 SomeFunc 的无关声明,如下所示:

#include <FooObj.h>

// I don't know why this declaration exists but its presence is
// causing the compiler to include SomeFunc and everything it references
// in the object file causing eventual linker errors! Also notice that
// this declaration even misses the "inline" keyword.
extern "C" void SomeFunc(void* user_data);

extern "C" inline void SomeFunc(void* user_data)
{   
    A* obj = static_cast<A*>(user_data);
    obj->CallAnotherFunc(FooObj(33));
}

删除这个无关的声明可以消除链接器错误,还可以防止伪造的符号出现在目标文件中。

关于c++ - extern "C"在已编译的目标代码中运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37513384/

相关文章:

c++ - 将单个字符串/字符输入串行监视器

c++ - 如何让标准文件流返回有用的错误消息?

c++ - UNIX API 调用 : Using read() function to open and print a file to the screen adds extra random characters

c++ - 我如何布局混合 C 和 C++ 的函数原型(prototype)

c++ - 我们可以在没有#ifdef __cplusplus 的情况下在C 文件中使用extern "C"吗?

c++ - 排序后访问 vector 的第 n 个元素(值)

c++ - 如何在 Win32 上的 WS_EX_CLIENTEDGE "Edit"文本字段上打断文本行

c++ - 什么样的 C++ 函数可以放在 C 函数指针中?

c++ - 如何从 C 调用 C++ 函数?

c++ - C++中extern "C"的作用是什么?