使用 std::unique_ptr 时静态库中出现奇怪的 'missing import symbols'
Strange 'missing import symbols' in static lib when using std::unique_ptr
随意编辑标题:老实说,我不知道这个问题的重要信息是什么...
我在 link 运行应用程序时看到一些非常奇怪的缺失符号(针对 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:未解析的外部符号 __imp_CreateCompatibleBitmap 在函数读取屏幕中引用
1>libeay32.lib(rand_win.obj) : error LNK2019: 未解析的外部符号 __imp_DeleteObject 在函数 readscreen 中引用
1>libeay32.lib(rand_win.obj) : error LNK2019: 未解析的外部符号 __imp_GetDeviceCaps 在函数 readscreen 中引用
1>libeay32.lib(rand_win.obj) : error LNK2019: 未解析的外部符号 __imp_GetDIBits 在函数 readscreen 中引用
1>libeay32.lib(rand_win.obj):错误 LNK2019:函数 readscreen
中引用了未解析的外部符号 __imp_GetObjectW
如果我撤销声明,错误就会消失
//std::unique_ptr<grpc::Server> m_server;
grpc::Server* m_server;
==========构建:1个成功,0个失败,0个up-to-date,0个跳过==========
同样奇怪的是错误本身——这些错误来自 gRPC 的构建。我 link 到静态库,所以很明显我可能只是缺少 linking 到另一个库(如果 unique_ptr 事情变得有意义) - 但我无法想象为什么gRPC 会调用 getDIBits 吗?这有意义吗(注意——我还没有阅读源代码来验证,这看起来很奇怪)。有没有可能我 link 编在一起的库可能会相互混淆?可能是 names/fn 定义之间的冲突,或其他原因?
为什么 unique_ptr 给出与原始指针不同的结果?因为 unique_ptr 特化包括对 grpc::~Server 析构函数的调用,而原始指针则没有。链接器可以从二进制文件中删除未使用的文件(甚至单个函数),因此如果析构函数调用了一些未解析的引用,那么如果析构函数被优化掉,它们可能不会出现。
这些 GDI 调用来自哪里?实际错误来自 OpenSSl;我的猜测是 gRPC 使用 openssl 进行 https 访问,而 openssl 反过来使用 screengrabs 来生成一些随机性。
编辑:我意识到这个解释对手头的问题没有帮助。所以,要解决这个问题,你只需要 link 和 gdi32.dll
随意编辑标题:老实说,我不知道这个问题的重要信息是什么...
我在 link 运行应用程序时看到一些非常奇怪的缺失符号(针对 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:未解析的外部符号 __imp_CreateCompatibleBitmap 在函数读取屏幕中引用 1>libeay32.lib(rand_win.obj) : error LNK2019: 未解析的外部符号 __imp_DeleteObject 在函数 readscreen 中引用 1>libeay32.lib(rand_win.obj) : error LNK2019: 未解析的外部符号 __imp_GetDeviceCaps 在函数 readscreen 中引用 1>libeay32.lib(rand_win.obj) : error LNK2019: 未解析的外部符号 __imp_GetDIBits 在函数 readscreen 中引用 1>libeay32.lib(rand_win.obj):错误 LNK2019:函数 readscreen
中引用了未解析的外部符号 __imp_GetObjectW如果我撤销声明,错误就会消失
//std::unique_ptr<grpc::Server> m_server;
grpc::Server* m_server;
==========构建:1个成功,0个失败,0个up-to-date,0个跳过==========
同样奇怪的是错误本身——这些错误来自 gRPC 的构建。我 link 到静态库,所以很明显我可能只是缺少 linking 到另一个库(如果 unique_ptr 事情变得有意义) - 但我无法想象为什么gRPC 会调用 getDIBits 吗?这有意义吗(注意——我还没有阅读源代码来验证,这看起来很奇怪)。有没有可能我 link 编在一起的库可能会相互混淆?可能是 names/fn 定义之间的冲突,或其他原因?
为什么 unique_ptr 给出与原始指针不同的结果?因为 unique_ptr 特化包括对 grpc::~Server 析构函数的调用,而原始指针则没有。链接器可以从二进制文件中删除未使用的文件(甚至单个函数),因此如果析构函数调用了一些未解析的引用,那么如果析构函数被优化掉,它们可能不会出现。 这些 GDI 调用来自哪里?实际错误来自 OpenSSl;我的猜测是 gRPC 使用 openssl 进行 https 访问,而 openssl 反过来使用 screengrabs 来生成一些随机性。 编辑:我意识到这个解释对手头的问题没有帮助。所以,要解决这个问题,你只需要 link 和 gdi32.dll