环境是 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/