环境是Microsoft Visual C ++ 2015和Windows 7。
标题中定义的inline extern "C"
函数有什么特别之处吗?我正在使用一个SDK,其中一个标题包含这样的野兽。在我的应用程序中,我有一个单独的TU(翻译单元),其生活中唯一的工作就是包括前面提到的标题。就这样。没有别的东西在里面。如果我深入研究生成的目标文件,我会看到extern "C"
函数被拉入。这会给我带来一些不必要的副作用(我将忽略它们现在的用途,因为它可能会分散主要问题的注意力)。
为什么会这样?客户端代码中没有任何内容(请记住我的唯一TU是空的,除了main()
入口点和那个标头),这会触发这种情况发生。
更新,其中包含一个小片段,可以更好地解释我遇到的问题:
这就是实际发生的事情:
FooObj::FooObj() { }
FooObj::~FooObj() { CallIntoAnotherC_API(); }
#include <FooObj.h>
extern "C" inline void SomeFunc(void* user_data)
{
A* obj = static_cast<A*>(user_data);
obj->CallAnotherFunc(FooObj(33));
}
#include "SDKHeader.h"
int main() { return 0; }
将MyFile.cpp编译为可执行文件失败,链接器抱怨 CallIntoAnotherC_API是一个未解析的外部。
答案 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));
}
删除这个无关的声明可以消除链接器错误,还可以防止伪造的符号出现在目标文件中。