配置 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之前,怀疑是顺序问题
对链接器也是同样的操作,检查附加库目录
检查附加依赖项
都没问题啊,开始怀疑那个错误,首先这是一个链接错误,说明不是没找到 include/GL那个路径,为什么要同时打开exe和include目录呢,exe所在目录没问题,这里如果你了解编译-链接的过程的话,肯定会直接看出问题所在,只不过我一知半解,猜中了,原来是
链接器的输出目录被我改了!
打开一看,果然不止有exe,还有一个include目录,转手删掉include目录,再次执行,按理说问题解决了。
居然还报错!无法找到启动程序,我就奇怪了,那么大个exe放在那里怎么就找不到呢,打开目录再次确认,发现文件类型exe多了一个‘;’,原来是我删除目录的时候少删了一个分号,导致输出目录proj.exe变成了 proj.exe; 文件类型变了,就跑不了了。改正,openGL启动!成功。
那么这编译链接到底是怎么回事呢,再研究一下
编译与链接的顺序及作用如下:
- 为什么要先编译:
-
每个源文件(.c/.cpp)单独进行预处理、语法分析和代码生成。
-
产生一堆对应的对象文件(.o文件)。
-
对象文件包含了源文件中定义的所有函数/变量,但符号未解决。
- 链接的作用:
-
将所有对象文件进行连接合成一个可执行程序。
-
解决对象文件中的外部符号引用,消除重定义等问题。
-
为符号绑定实际的内存地址。
-
产生完整可执行文件,包含程序要运行所需的所有代码和数据。
所以:
-
编译产生对象文件,每个文件各自处理完毕。
-
链接将对象文件连接汇总,成就可执行整体架构。
-
编译生成符号,链接解决符号引用,二者协作完成整个过程。
因此,编译先生成各部分,链接后集成整体,这是C/C++标准编译流程。
链接器的附加库目录只是提供了目录,具体需要目录里哪一个需要在附加依赖项塞进去。
include目录包含需要的头文件,头文件调用库文件,lib或者dll,是这么回事。