外部"C"已编译目标代码中的函数
extern "C" functions in compiled object code
环境是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));
}
删除这个无关的声明可以消除链接器错误,还可以防止伪符号出现在对象文件中。
相关文章:
- 如何将 c++ get 函数代码转换为 opencv 算法中使用的 python
- 修改链表主函数代码,用户将在其中输入节点的索引和数据以及正确的消息
- 是否可以像这样编写c malloc函数代码
- 函数范围的静态变量如何导致与共享库中函数代码的未来使用不兼容
- 如何将C++ lambda 函数代码转换为 C#?
- 该构造函数代码如何将指针作为参数
- 调用C++具有复杂参数和复杂返回类型的函数 C 代码
- "_FCbuild"不能用作函数 - C/C++ 代码错误
- 复制赋值和复制构造函数(代码C++的差异)
- 反向链表的递归函数(代码段说明)
- 当满足条件时,是否可以在 GLSL 着色器中回调 C/C++ 函数/代码
- 在构造函数代码之前禁用默认类成员初始化
- 以下移动构造函数代码安全吗?
- C++构造函数代码..这叫什么
- 如何更改SWIG生成的CSHARP文件中的构造函数代码
- 找不到当前函数(代码::块)C++的边界
- 使用模板进行 C++ 函数代码泛化
- 编写此指针函数代码的长格式方法是什么
- C++某些构造函数代码之间的区别
- 错误C2668从站点对重载函数代码的调用不明确http://h264bitstream.sourceforge.net/