我有一个从某些数据自动生成的C源文件:

#include <stdint.h>
size_t BlurKernel_size = 840;
unsigned char BlurKernel[] = {
0x06b, 0x65, 0x72, // ... etc
};

我使用
cl /nologo kernels_embedd.c /c /Fokernels_embedd.obj /W4 /O2 /MT

然后把它放到一个静态库中
lib /nologo /OUT:kernels_embedd.lib kernels_embedd.obj

然后我把它和我的主程序连接起来(主程序可以执行extern const char* BlurKernel; extern const size_t BlurKernel_size;):
link /nologo /OUT:main.dll /DLL main.obj kernels_embedd.lib /IMPLIB:main.lib

我明白了
main.obj : error LNK2019: unresolved external symbol "char const * const BlurKernel" (?BlurKernel@@3PEBDEB) referenced in function "public: __cdecl BlendIop::BlendIop(class Node *)" (??0BlendIop@@QEAA@PEAVNode@@@Z)
main.obj : error LNK2019: unresolved external symbol "unsigned __int64 const BlurKernel_size" (?BlurKernel_size@@3_KB) referenced in function "public: __cdecl BlendIop::BlendIop(class Node *)" (??0BlendIop@@QEAA@PEAVNode@@@Z)
main.dll : fatal error LNK1120: 2 unresolved externals

但是,查看kernels_embedd.libdumpbin,符号是可用的:
> dumpbin kernels_embedd.lib /symbols
Microsoft (R) COFF/PE Dumper Version 10.00.30319.01
Copyright (C) Microsoft Corporation.  All rights reserved.


Dump of file kernels_embedd.lib

File Type: LIBRARY

COFF SYMBOL TABLE
000 00AA766F ABS    notype       Static       | @comp.id
001 00000000 SECT1  notype       Static       | .drectve
    Section length   45, #relocs    0, #linenums    0, checksum        0
003 00000000 SECT2  notype       Static       | .debug$S
    Section length   CC, #relocs    0, #linenums    0, checksum        0
005 00000000 SECT3  notype       Static       | .data
    Section length  358, #relocs    0, #linenums    0, checksum ABAE4B9B
007 00000000 SECT3  notype       External     | BlurKernel_size
008 00000010 SECT3  notype       External     | BlurKernel

String Table Size = 0x1F bytes

  Summary

        358 .data
          CC .debug$S
          45 .drectve

(当使用kernels_embedd.obj查看dumpbin时,我得到相同的输出)。
我以前在GCC中成功地使用过这种方法。我做错了什么?

最佳答案

正如IgorTandetnik指出的那样,这些符号需要以C方式被删除,以避免C++名称的篡改。

extern "C" unsigned char BlurKernel[];
extern "C" size_t BlurKernel_size;

为了纠正问题中的错误,一个重要的旁注是:BlurKernel被定义为数组,因此必须将其作为数组进行外部处理。使用unsigned char* BlurKernel不起作用(当指针被取消引用时会导致访问冲突)。

关于c - 静态库中的MSVC符号可见性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48099039/

10-10 07:33