静态库中的MSVC符号可见性
我有一个C源文件,它是根据一些数据自动生成的:静态库中的MSVC符号可见性,c,visual-c++,C,Visual C++,我有一个C源文件,它是根据一些数据自动生成的: #include <stdint.h> size_t BlurKernel_size = 840; unsigned char BlurKernel[] = { 0x06b, 0x65, 0x72, // ... etc }; 然后将其放入静态库中 lib /nologo /OUT:kernels_embedd.lib kernels_embedd.obj 然后我将它与我的主程序链接(它执行extern const char*Blu
#include <stdint.h>
size_t BlurKernel_size = 840;
unsigned char BlurKernel[] = {
0x06b, 0x65, 0x72, // ... etc
};
然后将其放入静态库中
lib /nologo /OUT:kernels_embedd.lib kernels_embedd.obj
然后我将它与我的主程序链接(它执行extern const char*BlurKernel;extern const size\u t BlurKernel\u size;
):
我得到了错误
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
但是,查看带有dumpbin
的kernels\u embedded.lib
,可以使用以下符号:
> 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
(当使用dumpbin
查看kernels\u embedded.obj
时,我得到了相同的输出)
我以前在GCC中成功地使用过这种方法。我在MSVC上做了什么? < P>正如IgorTandetnik指出的,符号需要以C方式被删除,以避免C++名称的篡改。
extern "C" unsigned char BlurKernel[];
extern "C" size_t BlurKernel_size;
要纠正问题中的一个错误,一个重要的补充说明是:
BlurKernel
被定义为数组,因此将其作为数组进行外部处理很重要。使用<代码>无符号char *Ungult>代码>不起作用(当指针被撤销时导致访问冲突)。IgorTandetnik指出,符号需要以C方式被删除,以避免C++名称的篡改。
extern "C" unsigned char BlurKernel[];
extern "C" size_t BlurKernel_size;
要纠正问题中的一个错误,一个重要的补充说明是:
BlurKernel
被定义为数组,因此将其作为数组进行外部处理很重要。使用<代码>未签名的char *模糊内核< /> >不工作(在指针被撤销时导致访问冲突)。< >外部>“C”{Extn const char *模糊核;外部consisisixFuffkNelx大小;} /代码>链接器正在寻找< C++ >模糊核@ @ 3PEBDEB < /COD>符号(C++被忽略的名称),但是可用的是BlurKernel
symbol。禁止名称损坏。/IMPLIB:main.lib
是打字错误吗?我以为您的静态库名为kernels\u embedded.lib
@IgorTandetnik Aha!我现在明白了。谢谢你,真管用@IanAbbott/IMPLIB
指定DLL的导入库的名称(默认为.lib
,因此在这种情况下参数是多余的)。在windows上,即使要链接到共享库,也有一个单独的.lib
文件。@NiklasR是的,我应该检查一下/IMPLIB
的实际功能!很高兴你让它工作了。那么kernels\u embedded.lib
链接到哪里呢?在C++代码>链接> <代码>命令中,如果<代码> > Obj/<代码>实际上是<代码> KelnsS*EntDI.LIB <代码>?使它为代码>外部“C”{Extn const char *模糊核;外部consisisixFuffkNell大小;} /代码>链接器正在查找<代码>?但是可用的是BlurKernel
symbol。禁止名称损坏。/IMPLIB:main.lib
是打字错误吗?我以为您的静态库名为kernels\u embedded.lib
@IgorTandetnik Aha!我现在明白了。谢谢你,真管用@IanAbbott/IMPLIB
指定DLL的导入库的名称(默认为.lib
,因此在这种情况下参数是多余的)。在windows上,即使要链接到共享库,也有一个单独的.lib
文件。@NiklasR是的,我应该检查一下/IMPLIB
的实际功能!很高兴你让它工作了。那么kernels\u embedded.lib
链接到哪里呢?link
命令中的kernels\u embedded.obj
实际上应该是kernels\u embedded.lib
?
extern "C" unsigned char BlurKernel[];
extern "C" size_t BlurKernel_size;