今天下午在练习C++中调用C写的代码时,一切准备妥当之后生成解决方案却突然报出
LNK1104:无法打开testlib.lib
我以为是在设置时粗心弄错了目录,于是反复检查附加库目录设置和附加依赖项,静态库文件夹和文件名反复检查仍然编译不通过报LNK1104错误。如图:
可以看到设置是完全没有问题的,但是仍然无法打开我的库文件testlib.lib。
于是我仔细查看了一下LNK1104错误出现的可能原因:链接器工具错误 LNK1104 | Microsoft Learn
排除了大部分原因之后我猜测是路径的问题,于是我把静态库的文件放在了D盘根目录下:
再调整一下附加库目录的路径
再次生成解决方案,编译成功了。
程序也是没有问题。
到了这里,我更加确定了问题是出在文件路径上,官方中有个解释是:路径太长。
但是我原本的路径其实也并不算长,也没有达到官方所说的超过260个字符
我的解决方案属于重新排列目录结构缩短了路径,于是我尝试一层一层地增加路径(静态库文件testlib.lib在testlib文件夹中)
D:\testlib 编译通过
D:\学习\testlib 编译通过
D:\学习\码\testlib 编译通过
D:\学习\码\C,C++\testlib 编译不通过
在我尝试第四次增加路径层数时出现了编译不通过。
其实有一个更专业的名词叫目录深度(绝对路径深度),用来表达我所说的路径层数
关于目录深度可以解释为:将某个文件放置在D盘中,目录深度是1;如果放在D盘的某个文件中,目录深度是2,以此类推。
由于我的静态库文件testlib.lib在testlib文件夹中,所以可以知道在我的库文件目录深度为3、4、5时vs2019都可以找到我的库文件并且编译成功,但是当目录深度达到6时,vs2019就报错打不开我的testlib.lib文件了,也就回到了我文章开头的问题上。
总结
在确认了附加库目录设置和附加依赖项,静态库文件夹和文件名反复检查仍然编译不通过报LNK1104错误时,可以考虑是否是目录深度的问题,在我的windows10,vs2019环境下库文件目录深度>=6时就会出现该问题,解决方案可以是减小库文件目录深度。不同的环境下由于目录深度原因导致会出现该问题的目录深度可能不一样。