奇怪的链接错误 LNK1104

简介: 奇怪的链接错误 LNK1104

缘起

一般情况下链接错误很好解决,最常见的是重定义和找不到外部符号,不过这次遇到的链接错误有些奇怪,一起来看看吧。

初遇错误

写完代码,开开心心的编译,没想到遇到下面的链接错误。

LNK1104.png

不慌,这种错误见的太多了,见怪不怪了。终极原因是:链接的时候找不到合适的库。大概率是库路径设置不对,或者没引用这个 lib。因为代码中明确使用 #pragma comment(lib, lib_path) 引用了库,所以问题大概率出在库路径上。

verify-lib-referenced.png

在检查工程设置前,先介绍下两个工程的输出目录,也就是 $(OutDir) 的值。

TestLinkErrorExe 工程的 OutDir 如下图所示:

exe-project-outdir.png

TestLinkErrorDll 工程的 OutDir 如下图所示:

dll-project-outdir.png

都指向了 $(SolutionDir)bin\$(Platform)\$(Configuration)\$(SolutionDir) 指的是 .sln 文件所在的路径,这里是 E:\working\MyTestProjects\TestLinkError\,因为编译的是 64Debug 版本,所以 $(Platform) 的值是 x64$(Configuration) 的值是 Debug。所以,最终的路径是: E:\working\MyTestProjects\TestLinkError\bin\x64\Debug\

有了这个背景介绍,就可以接着查看工程设置了。

检查工程设置

因为 TestLinkErrorDll.libTestLinkErrorDll 工程产生的,需要保证 TestLinkErrorDll 先编译,如果先编译 TestLinkErrorExe 的话,链接的时候,TestLinkErrorDll 还没编译,TestLinkErrorDll.lib 也就不会产生,自然会找不到。所以,需要设置编译顺序,最简单的实现方式就是设置工程依赖。

Solution右键 -> Project Dependencies... 打开 Project Dependencies 设置界面,如下图:

check-project-dependency.png

经检查,工程依赖已经设置正确了。

检查完工程依赖,再检查库目录( Library Directories)。有两个地方需要检查:

check-standard-library-directory.png

check-additional-library-directories.png

经检查,这两处设置确实是正确的。纳尼?所有设置都正确!为什么结果不正确呢?直接打开 .vcxproj 文件查看里面的 OutDir 的值,如下图:

view-exe-vcxproj-content.png

从图中可知,<OutDir>...</OutDir><LibraryPath>...</LibraryPath> 的下方。果断调整顺序,再次编译,一切顺利。

反思

再次打开有问题的工程,查看 OutDir 属性的值,是错误的路径!如下图:

view-OutDir-value.png

总结

链接错误不可怕,耐心细致的查看工程设置,基本上都能解决掉。

相关文章
|
7月前
|
编译器 C语言
Qt使用MSVC编译错误: LNK2019: 无法解析的外部符号
Qt使用MSVC编译错误: LNK2019: 无法解析的外部符号
372 1
QT编译警告 warning LNK4042: 对象被多次指定;已忽略多余的指定
QT编译警告 warning LNK4042: 对象被多次指定;已忽略多余的指定
293 0
|
编译器 开发工具 Windows
VS2008 未找到编译器可执行文件 csc.exe【当网上其他方法试玩了之后不起作用的时候再用这个方法】
被公司派遣到中国海洋石油惠州炼化公司做项目,做的是生产管理,来了发现他们的项目结构简直烂的要命,和同学们写的毕业设计差不多,然后开发工具用的是vs2008,我电脑是安装了vs2005和vs2010,vs2012就是没有安装vs2008,在安装vs2008的时候那是一番折腾好长时间,然后把vs2008安装好了打开项目代码,生成解决方案发现报了好多错,然后一一解决,最奇怪的是VS2008 未找到编译器可执行文件 csc.exe,我把所以路径都配好了,并且在dos环境下执行csc.exe都可以执行,环境变量路径设置的也么有问题,就是很奇怪重启机子打开项目还是找不到csc.exe
194 0
|
芯片 C++
【MDK(keil)编译错误】找不到main.o及解决方法、多处报错“未定义”
【MDK(keil)编译错误】找不到main.o及解决方法、多处报错“未定义”
1212 0
【MDK(keil)编译错误】找不到main.o及解决方法、多处报错“未定义”
error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用
error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用
150 0
error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用
解决办法:C代码中明明有,为什么编译时提示未定义的引用
解决办法:C代码中明明有,为什么编译时提示未定义的引用
375 0
|
Windows
error LNK2019: 无法解析的外部符号 _WinMain,在函数_tmainCRTStartup中被引用
error LNK2019: 无法解析的外部符号 _WinMain,在函数_tmainCRTStartup中被引用
230 0
|
Java
编译OpenJDK12:LNK2019 无法解析的外部符号sprintf
编译OpenJDK12:LNK2019 无法解析的外部符号sprintf
136 0
C中使用errno查看函数调用的错误
C中使用errno查看函数调用的错误
79 0
|
C语言
错误解决办法:gcc编译时提示对‘sqrt’未定义的引用
错误解决办法:gcc编译时提示对‘sqrt’未定义的引用
223 0