静态库中的MSVC符号可见性

静态库中的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

我有一个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*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;