Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2644814
  • 博文数量: 416
  • 博客积分: 10220
  • 博客等级: 上将
  • 技术积分: 4193
  • 用 户 组: 普通用户
  • 注册时间: 2006-12-15 09:47
文章分类

全部博文(416)

文章存档

2022年(1)

2021年(1)

2020年(1)

2019年(5)

2018年(7)

2017年(6)

2016年(7)

2015年(11)

2014年(1)

2012年(5)

2011年(7)

2010年(35)

2009年(64)

2008年(48)

2007年(177)

2006年(40)

我的朋友

分类: C/C++

2018-04-26 10:46:54

   因业务需要用java开发Excel插件, 编译ExcelAddin4J C++工程时,遇到了这个错误。原因是在vs2015->配置属性->C/C++->代码生成->安全检查:禁用安全检查 (/GS-)。sprinf此函数实现调用
___stdio_common_vfprintf引起的,这是一个最基本的C++函数。若起用安全检查 (/GS-)则会报其它错误,启用它报的错误类型就它,估计解决要容易些,因此选择集中精力来解决它,错误信息如下:
   

1>Dictionary.obj : error LNK2019: 无法解析的外部符号 ___stdio_common_vfprintf,该符号在函数 __vfprintf_l 中被引用
1>Log.obj : error LNK2001: 无法解析的外部符号 ___stdio_common_vfprintf
1>ExcelAddin4J.obj : error LNK2001: 无法解析的外部符号 ___stdio_common_vsprintf
1>Classpath.obj : error LNK2001: 无法解析的外部符号 ___stdio_common_vsprintf
1>VM.obj : error LNK2001: 无法解析的外部符号 ___stdio_common_vsprintf
1>Dictionary.obj : error LNK2001: 无法解析的外部符号 ___stdio_common_vsprintf
1>Icon.obj : error LNK2001: 无法解析的外部符号 ___stdio_common_vsprintf
1>INI.obj : error LNK2001: 无法解析的外部符号 ___stdio_common_vsprintf
1>Log.obj : error LNK2001: 无法解析的外部符号 ___stdio_common_vsprintf
1>Dictionary.obj : error LNK2019: 无法解析的外部符号 ___stdio_common_vsscanf,该符号在函数 __vsscanf_l 中被引用
1>Log.obj : error LNK2019: 无法解析的外部符号 ___acrt_iob_func,该符号在函数 "public: static void __cdecl Log::Init(struct HINSTANCE__ *,char const *,char const *)" (?Init@Log@@SAXPAUHINSTANCE__@@PBD1@Z) 中被引用
1>Log.obj : error LNK2019: 无法解析的外部符号 __fdopen,该符号在函数 "private: static void __cdecl Log::RedirectIOToConsole(void)" (?RedirectIOToConsole@Log@@CAXXZ) 中被引用
1>Log.obj : error LNK2019: 无法解析的外部符号 ___stdio_common_vsprintf_s,该符号在函数 __vsprintf_s_l 中被引用
1>D:\dev\workspace\excel\xll\winrun4j\prj\\build\ExcelAddin4J-Debug\ExcelAddin4J.xll : fatal error LNK1120: 6 个无法解析的外部命令

     原理上是引用库有问题,但查阅众多资料,反复测试也没有太多进展,折腾得我快想放弃此工程了。

无意中看到一篇关于link库文件问题文章:
就把其中的:
#pragma comment(lib, "msvcrtd.lib") 
#pragma comment(lib, "vcruntimed.lib") 
#pragma comment(lib, "ucrtd.lib") 
放到CPP文件中测试,居然居然好了,太TMD的意外了。
赶紧测试编译出来的xll文件是否正常,也记录此次编译的解决方法,以供遇到类似问题的同行参考。
//////////////////////////////////////////////////////////////////
我不明白为什么一定要手动指定 main 函数作为入口。使用默认的 mainCRTStartup 显然是更安全的选项。 
如果一定要这样做可以使用下面的方法手动链接运行库。 
#pragma comment(lib, "msvcrtd.lib") 
#pragma comment(lib, "vcruntimed.lib") 
#pragma comment(lib, "ucrtd.lib") 
需要根据自己的编译选项来确定链接哪些库 
Release DLLs (/MD ): msvcrt.lib vcruntime.lib ucrt.lib 
Debug DLLs (/MDd): msvcrtd.lib vcruntimed.lib ucrtd.lib 
Release Static (/MT ): libcmt.lib libvcruntime.lib libucrt.lib 
Debug Static (/MTd): libcmtd.lib libvcruntimed.lib libucrtd.lib


阅读(21743) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~