LINK : fatal error LNK1104: 无法打开文件“E:\xxx\Debug\pro_cpp_1.exe;E:\xxxDependence\GLEW\include“

配置 glew,glfw遇到的错误,完整错误:

2>E:\app\vs2022\ideSet\MSBuild\Microsoft\VC\v170\Microsoft.CppBuild.targets(1389,5): warning MSB8012: TargetPath(E:\Proj\vsProj\pro_cpp_1\Debug\pro_cpp_1.exe) 与 Linker 的 OutputFile 属性值(E:\Proj\vsProj\pro_cpp_1\Dependence\GLEW\include)不匹配。这可能导致项目生成不正确。若要更正此问题,请确保 $(OutDir)、$(TargetName) 和 $(TargetExt) 属性值与 %(Link.OutputFile) 中指定的值匹配。
2>E:\app\vs2022\ideSet\MSBuild\Microsoft\VC\v170\Microsoft.CppBuild.targets(1391,5): warning MSB8012: TargetName(pro_cpp_1) 与 Linker 的 OutputFile 属性值(include)不匹配。这可能导致项目生成不正确。若要更正此问题,请确保 $(OutDir)、$(TargetName) 和 $(TargetExt) 属性值与 %(Link.OutputFile) 中指定的值匹配。
2>LINK : fatal error LNK1104: 无法打开文件“E:\Proj\vsProj\pro_cpp_1\Debug\pro_cpp_1.exe;E:\Proj\vsProj\pro_cpp_1\Dependence\GLEW\include”
2>已完成生成项目“pro_cpp_1.vcxproj”的操作 - 失败。

我就先检查了C/C+±常规-附加包含目录,把glew调整到glfw之前,怀疑是顺序问题
LINK : fatal error LNK1104: 无法打开文件“E:\xxx\Debug\pro_cpp_1.exe;E:\xxxDependence\GLEW\include“_第1张图片
对链接器也是同样的操作,检查附加库目录
LINK : fatal error LNK1104: 无法打开文件“E:\xxx\Debug\pro_cpp_1.exe;E:\xxxDependence\GLEW\include“_第2张图片
检查附加依赖项
LINK : fatal error LNK1104: 无法打开文件“E:\xxx\Debug\pro_cpp_1.exe;E:\xxxDependence\GLEW\include“_第3张图片
都没问题啊,开始怀疑那个错误,首先这是一个链接错误,说明不是没找到 include/GL那个路径,为什么要同时打开exe和include目录呢,exe所在目录没问题,这里如果你了解编译-链接的过程的话,肯定会直接看出问题所在,只不过我一知半解,猜中了,原来是

链接器的输出目录被我改了!

打开一看,果然不止有exe,还有一个include目录,转手删掉include目录,再次执行,按理说问题解决了。

居然还报错!无法找到启动程序,我就奇怪了,那么大个exe放在那里怎么就找不到呢,打开目录再次确认,发现文件类型exe多了一个‘;’,原来是我删除目录的时候少删了一个分号,导致输出目录proj.exe变成了 proj.exe; 文件类型变了,就跑不了了。改正,openGL启动!成功。

那么这编译链接到底是怎么回事呢,再研究一下

编译与链接的顺序及作用如下:

  1. 为什么要先编译:
  • 每个源文件(.c/.cpp)单独进行预处理、语法分析和代码生成。

  • 产生一堆对应的对象文件(.o文件)。

  • 对象文件包含了源文件中定义的所有函数/变量,但符号未解决。

  1. 链接的作用:
  • 将所有对象文件进行连接合成一个可执行程序。

  • 解决对象文件中的外部符号引用,消除重定义等问题。

  • 为符号绑定实际的内存地址。

  • 产生完整可执行文件,包含程序要运行所需的所有代码和数据。

所以:

  • 编译产生对象文件,每个文件各自处理完毕。

  • 链接将对象文件连接汇总,成就可执行整体架构。

  • 编译生成符号,链接解决符号引用,二者协作完成整个过程。

因此,编译先生成各部分,链接后集成整体,这是C/C++标准编译流程。


链接器的附加库目录只是提供了目录,具体需要目录里哪一个需要在附加依赖项塞进去。

include目录包含需要的头文件,头文件调用库文件,lib或者dll,是这么回事。

你可能感兴趣的:(openGL,c++)