无法解析的外部符号——shell32.lib——VS宏定义问题——%(AdditionalDependencies)
严重性 代码 说明 项目 文件 行 禁止显示状态
错误 LNK2019 无法解析的外部符号 __imp_SHGetSpecialFolderPathA,该符号在函数 "public: static class SEACAVE::String __cdecl SEACAVE::Util::getApplicationFolder(void)" ([email protected]@[email protected]@[email protected]@XZ) 中被引用 InterfaceCOLMAP D:\3dRecon\openMVS\release\apps\InterfaceCOLMAP\Common.lib(Util.obj) 1
无法解析的外部符号 通常是找不到库。比如,但不限于shell32.lib。
解决方法通常有,手动链接相应库。
#pragma comment(lib, "shell32.lib")
那么为什么别人机器上跑着很正常的工程,在我这,需要额外引用库呢?
区别来自于%(AdditionalDependencies)
这个是从本机继承的,和自己的机器有关,而没有随着工程复制而改变。别人的这个参数包含了shell32.lib,而我的不包含,这就是区别
问题找到了,那么,怎么改?
一般来讲,这个东西躺在props文件里
那么问题是,我这个工程拿的是哪个props?
从属性管理器去找。
其实这里是有的,但是很显然,有很多个,尤其opencv3.4.2可能是我自己定义的,可能被default了。
如下,opencv3.4.2没有这几个常规默认项。
(问题是,这一堆props,到底以谁为准?还是“从父级或项目默认设置继承”互相冲掉了?)
观察现象:opencv342是继承的libboost
boost继承空,断掉了
(后三个灰色的不能改)前三个好像顺序依赖,但是在boost断了,boost是拷贝过来的props,可能在找系统变量时出错了。
怎么改?不要再属性管理器双击,搜到文件,拖进VS,直接改。
再重新打开一下VS,继承成功。
注销掉主动链接,编译成功
更简单方法就是手动加shell32.lib,不用写进任何变量内,但是一旦工程项多,你需要给每个都手动加一次。(这方法的愚蠢程度,无异于直接写pragma comment)