我有一个从某些数据自动生成的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.lib
和dumpbin
,符号是可用的:> 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/