编译对象代码中的extern“C”函数

时间:2016-05-29 18:22:04

标签: c++ extern-c

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

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

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

更新,其中包含一个小片段,可以更好地解释我遇到的问题:

这就是实际发生的事情:

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是一个未解析的外部。

1 个答案:

答案 0 :(得分:0)

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

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

相关问题