外部"C"已编译目标代码中的函数

extern "C" functions in compiled object code

本文关键字:函数 代码 编译 外部 目标      更新时间:2023-10-16

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

标头中定义的inline extern "C"函数有什么特别之处吗?我正在使用一个SDK,其中一个头部包含这样一个野兽。在我的申请中,我有一个单独的TU(翻译单位),他一生中唯一的工作就是包括前面提到的标题。仅此而已。里面没有其他东西。如果我深入研究生成的对象文件,我会看到extern "C"函数被拉了进来。这会给我带来一些不必要的副作用(我现在会忽略它们,因为这可能会分散我对主要问题的注意力)。

为什么会发生这种情况?客户端代码中没有任何东西(记住,除了main()入口点和那个标头之外,我唯一的TU是空的)触发了这种情况的发生。

更新,并附上一个小片段,可以更好地解释我遇到的情况:

这就是实际发生的事情:

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));
}

MyFile.cpp

#include "SDKHeader.h"
int main() { return 0; }

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

Jonathan Leffler!非常感谢你为我指明了正确的方向。我发现了问题是什么,至少可以说这非常奇怪。在我上面发布的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));
}

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