【问题标题】:Strange 'missing import symbols' in static lib when using std::unique_ptr使用 std::unique_ptr 时静态库中奇怪的“缺少导入符号”
【发布时间】:2016-10-01 15:05:27
【问题描述】:

随意编辑标题:老实说,我不知道这个问题的重要信息是什么......

链接应用程序时,我看到一些非常奇怪的缺失符号(针对 gRPC 和 Kinect10 SDK 构建,如果重要,ptr 类型在 gRPC 静态库中定义),但仅在使用 std::unique_ptr 时。我实际上根本没有使用 ptr(还),但如果我转换为原生 ptr,它不会出错。

为什么会发生这种情况?我正在用 VS2015 x64 编译

std::unique_ptr<grpc::Server> m_server;
//grpc::Server* m_server;

1>libeay32.lib(rand_win.obj):错误 LNK2019:函数 readscreen 中引用的未解析的外部符号 __imp_CreateCompatibleBitmap 1>libeay32.lib(rand_win.obj) : 错误 LNK2019: 函数 readscreen 中引用的未解析的外部符号 __imp_DeleteObject 1>libeay32.lib(rand_win.obj) : 错误 LNK2019: 函数 readscreen 中引用的未解析的外部符号 __imp_GetDeviceCaps 1>libeay32.lib(rand_win.obj) : 错误 LNK2019: 函数 readscreen 中引用的未解析的外部符号 __imp_GetDIBits 1>libeay32.lib(rand_win.obj) : 错误 LNK2019: 函数 readscreen 中引用的未解析的外部符号 __imp_GetObjectW

如果我反转声明,错误就会消失

//std::unique_ptr<grpc::Server> m_server;
grpc::Server* m_server;

========== 构建:1 个成功,0 个失败,0 个最新,0 个跳过 ==========

错误本身也很奇怪——这些错误来自 gRPC 的构建。我链接到静态库,所以很明显我可能只是缺少链接到另一个库(如果 unique_ptr 事情变得有意义的话) - 但我无法想象为什么 gRPC 会调用 getDIBits?这有什么意义吗(注意 - 我没有阅读源代码来验证,这看起来很奇怪)。我链接在一起的库是否可能会相互混淆?可能是由于名称/fn 定义之间的冲突,还是其他原因?

【问题讨论】:

    标签: c++ stl linker static-linking grpc


    【解决方案1】:

    为什么 unique_ptr 给出与原始指针不同的结果?因为 unique_ptr 特化包括对 grpc::~Server 析构函数的调用,而原始指针没有。链接器可以从二进制文件中删除未使用的文件(甚至单个函数),因此如果析构函数调用了一些未解析的引用,如果析构函数被优化,它们可能不会出现。 这些 GDI 调用来自哪里?实际错误来自 OpenSSl;我的猜测是 gRPC 使用 openssl 进行 https 访问,而 openssl 又使用 screengrabs 来生成一些随机性。 编辑:我意识到这个解释对手头的问题没有帮助。所以,要解决这个问题,你只需要链接 gdi32.dll

    【讨论】:

    • 简单的解释和简单的修复。我最喜欢的 - 谢谢!
    猜你喜欢
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    • 2020-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-25
    • 1970-01-01
    相关资源
    最近更新 更多