visual studio 2008 编译项目出现层次不穷问题枚举

news2024/11/13 7:52:26

文章目录

  • 1、严重性 代码 说明 项目 文件 行 禁止显示状态 错误 C1047 对象或库文件“.lib”是使用与其他对象(如“x64\Release\main.obj”)不同的
      • 1、错误原因
  • 2、意外的预编译头错误,只需重新运行编译器就可能修复此问题
  • 3、 warning LNK4099: 未找到 PDB“vc90.pdb”(使用“../../lib\SafeStored.lib”或在“f:\sdologin_code\trunk\bin\Debug\pdb\vc90.pdb”中寻找);正在链接对象,如同没有调试信息一样
  • 4、VS2008中编译通过,但调试时出现“未使用调试信息生成二进制文件”的问题

1、严重性 代码 说明 项目 文件 行 禁止显示状态 错误 C1047 对象或库文件“.lib”是使用与其他对象(如“x64\Release\main.obj”)不同的

严重性 代码 说明 项目 文件 行 禁止显示状态
错误 C1047 对象或库文件“.\lib\SceneTempCal.lib”是使用与其他对象(如“x64\Release\main.obj”)不同的编译器版本创建的;请使用相同的编译器重新生成所有对象和库 SceneTest E:\osg\work\ThermalCharacteristics_20220628\SceneTest\LINK 1
在这里插入图片描述

1、错误原因

VS2019 或者其他编译器VS2008开发,之前一直用的Debug模式,代码编译正常

最近改为Release模式,一编译就出现这个错误:

LINK : fatal error C1047: 对象或库文件“.lib”是使用与其他对象(如“x64\Release\main.obj”)不同的编译器版本创建的;请使用相同的编译器重新生成所有对象和库

网上搜了一下,说是:

“我这几天也遇到了这个问题,用别人提供的lib,在vs2019下 debug模式可以运行,但release模式下就不行,出现了和你一样的错误。开始我还以为是lib不兼容,最后发现这个lib在LTCG下不能被解析,做如下改正即可:

Release模式下->配置属性->高级->全程序优化->使用链接时间代码生成 将这里的默认项 “使用链接时间代码生成”改为“无全程序优化”。 接下来就可以运行了。
在这里插入图片描述
在这里插入图片描述

一般低版本生成的lib都是可以被高版本编译器所用的,这个是兼容性的基础,呵呵!”

于是 改属性吧,改为 无全程序优化后,会报个另一个错,心想不能这么一直搞下去啊,肯定是哪不去了。

升级后重编译 也提示这个错,

但是这一次 属性里去掉无全程序优化后 再编译就通过了。

搞不懂,一个lib库 编译起来怎么还有这种情况?

属性->常规->项目默认值->全程序优化 将这里的默认项 “使用链接时间代码生成”改为“无全程序优化”。

这样设置后很多同学貌似解决了这个问题 ,然而并木有包括我。。。

记录一下,但是呢又出现了后面问题。

编译会提示新的错误:
fatal error C1900: “P1”(第“20081201”版)和“P2”(第“20070207”版)之间 Il 不匹配
。。。。。。。。。。。。。。。

继续。。。

原因:链接时使用了某些用更新的编译器编译的LTCG(Link Time Code Generation)的library。之所以x86是正常的,是因为很巧链接时使用的x86 lib是普通lib,而amd64 lib是LTCG lib。

说实话看不懂这是啥库。

解决方案两种:

  • 1)更新当前使用的编译链接工具,使其与lib匹配。当然,这样编译出来的二进制文件可能会有所改变(优化可能不同),所以可能需要重新测试。
  • 2)使用不带LTCG的library

说了等于没说,而且我觉得我这情况也不一样,因为在另外一台机器上编译是OK的。

后来我自己解决方法是下载:vs2008出现这样的错误是由于版本没有升级,在官网下载了一个升级包vs2008sp1,安装后程序运行正确。

这时我才意识到,所用的.lib库是在一个升级版的vs2008上编译得到的,至于在releasedebug模式下出现的错误不一致,我就不明白了。

既然这个lib库是在vs2008上编译的,vs2010应该是可以兼容使用的,我又检查了最开始在vs2010下运行的这个程序的配置,是在release模式下运行的,我改为debug模式运行后正确,检查了releasedebug的配置,发现“项目->属性->配置属性->常规->全程序优化” 在两个模式下不同,将这个选项改为 “无全程序优化”,之后程序就可以在两种模式下正常运行了。

通过这次调试得到一个结论,引用别人lib或者dll的时候,出现连接问题一般都是由于当前编译器版本过低,向上无法兼容;另外一些原因是编译器的设置问题,导致无法正确解析库文件。

vs2008中文 sp1版本下载地址:sp1中文版地址。

vs2008 英文sp1版本下载地址:sp1英文版地址。

2、意外的预编译头错误,只需重新运行编译器就可能修复此问题

昨天还好好的,今天打开vs2008,莫名就出现“意外的预编译头错误,只需重新运行编译器就可能修复此问题”。清理,重新编译,不行;重启编译器,清理,重新编译,还不行;最后试试,重启电脑,打开工程,清理,重新编译,又可以了。

官方给的解决方法:

  • 方法 1:

    • 禁用/analyze编译器选项,则它会被启用。
  • 方法 2:

    • 开始清理生成。
  • 方法 3:

    • 重新启动计算机。
  • 方法 4:

  • 禁用创建/使用预编译头的编译器选项。

注意这些方法不能保证正常工作。即使您使用这些方法之一,您可能仍会遇到此问题。

我的解决方案,重启电脑…

3、 warning LNK4099: 未找到 PDB“vc90.pdb”(使用“…/…/lib\SafeStored.lib”或在“f:\sdologin_code\trunk\bin\Debug\pdb\vc90.pdb”中寻找);正在链接对象,如同没有调试信息一样

LNK4099警告通常表示编译器无法找到与您的项目相关的调试信息文件(.pdb文件)。在您的情况下,它正在尝试查找名为"vc90.pdb"的文件。这个问题通常与编译器的调试信息生成设置有关。
在这里插入图片描述
当多个Project是分开编译的,主项目和子项目的pdb文件名相同(默认都是vc90.pdb或vc100.pdb)从而造成找不到调试信息,解决的办法是修改车险数据库文件名vc90.pdb为【项目名称.pdb】,如下所示:

一、在VS2008工程中,经常出现warning LNK4099: 未找到 PDB“vc90.pdb等问题,解决办法如下:

  1. 在项目属性—C/C++—输出文件—程序数据库文件名后面填写$(IntDir)\vc80.pdb。

  2. 在项目属性—连接器—调试—生成调试信息后面改成“否”。

举例: “warning LNK4099: 未找到 PDB“vc120.pdb”(使用“sqlite3d.lib(sqlite3secure.obj)”或在“D:\test\Debug\vc120.pdb”中寻找);正在链接对象,如同没有调试信息一样”。

使用VC时链接了第三方静态库, 并且第三方静态库(一般是开源的三方库)是在一个solution下的多个project, 当然,

网上基本都是这么回答的, 其实本质原因是因为这些开源库一般都会通过各种方式修改solution和project的默认路径

把二进制生成到同一个目录下, 比如lib, 而我们自己平时简单的静态库工程是不怎么修改默认工程配置的.由于每个

开源库的作者有自己的工程组织方式, 但导致LNK4099的最终原因无非是PDB路径问题。

解决方案

  • a. 如果确认不需要PDB, 即不需要调试开源库, 完全可以在设置里将/Zi或/ZI去掉, 这样即能消除warning也能提升开源库编译速度 。

  • b. 如果需要调试开源库, 方法也不复杂

    • b.1. 将开源库project里的C/C+±>General->Debug Information Format 设置为Zi或ZI(两者区别请自行google, Zi就够用了, 只是高版本的VS默认都是ZI)
    • b.2. 然后在C/C+±>Output Files->Pragram Database File Name 设置为(OutDir)(OutDir)(TargetName).pdb, (有些2B开源库这里设置的跟VS默认的是一样的比如(IntDir)vc(IntDir)vc(PlatformToolsetVersion).pdb, 但把IntDir改成了同一个目录, 每个project生成出来的pdb名字路径都是一致的, 当然就会出问题), 这里需要注意的是, 一定要确保(OutDir)(OutDir)(TargetName)是有意义的, 个别开源库完全不用vs自带的宏, 甚至个别开源库需要configure之后才生产vc project, 甚至是绝对路径, 但你所要确保的是, 目录必须跟生成的.lib是同一个, 文件名(不包括扩展名)必须是和生成的xxx.lib的xxx是一致的. 之后你要做的就是把每个project的debug&release都按照如上改好再编译就ok了。

4、VS2008中编译通过,但调试时出现“未使用调试信息生成二进制文件”的问题

Debug模式,运行时完全正常,但是一调试就出现对话框,显示出错信息:

“无法找到“XXX.exe”的调试信息,或者调试信息不匹配。未使用调试信息生成二进制文件。”

VC项目是空项目。发现其他的项目都可以调试,就“空项目”不行。

解决方法:

首先打开菜单 项目->项目属性页

  • 1。选择 配置属性->链接器->调试->生成调试信息 改为 是 。
  • 2。选择 配置属性->C/C++ ->常规->调试信息格式 改为 用于“编辑并继续”的程序数据库(/ZI) 。
  • 3。选择 配置属性->C/C++ ->优化->优化 改为 禁用(/Od) 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/977814.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构与算法系列3】有序数组的平方

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 示例 1: 输入:nums [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释:平方后,数组变为 …

JavaScript学习笔记01

JavaScript笔记01 什么是 JavaScript JavaScript 是一门世界上最流行的脚本语言,它是一种弱类型的脚本语言,其代码不需要经过编译,而是由浏览器解释运行,用于控制网页的行为。 发展历史 参考:JavaScript的起源故事…

AbstractQueuedSynchronizer--AQS

概述:全称是 AbstractQueuedSynchronizer,是阻塞式锁和相关的同步器工具的框架特点: 用 state 属性来表示资源的状态(分独占模式和共享模式),子类需要定义如何维护这个状态,控制如何获取锁和释放…

第9篇:ESP32超声波HC-SR04Arduino类库编写

第1篇:Arduino与ESP32开发板的安装方法 第2篇:ESP32 helloworld第一个程序示范点亮板载LED 第3篇:vscode搭建esp32 arduino开发环境 第4篇:vscodeplatformio搭建esp32 arduino开发环境 第5篇:doit_esp32_devkit_v1使用pmw呼吸灯实验 第6篇:ESP32连接无源喇叭播放音乐《涛声…

从一到无穷大 #13 How does Lindorm TSDB solve the high cardinality problem?

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。 文章目录 引言优势挑战系统架构细节/优化存储引擎索引写入查询 经验Ablation Study总结 引言 …

我的创作纪念日:一个特别的纪念日

一个特别的纪念日 机缘收获日常成就憧憬 💡一个热爱分享高性能服务器后台开发知识的博主,目标是通过理论与代码实践的结合,让世界上看似难以掌握的技术变得易于理解与掌握。技能涵盖了多个领域,包括C/C、Linux、中间件、数据库、云…

【C++学习笔记】7、常量

文章目录 【 1、常量的分类 】1.1 整型常量1.2 浮点常量1.3 字符常量1.4 字符串常量1.5 布尔常量 【 2、常量的定义 】2.1 #define 预处理器2.2 const 关键字 常量 是固定值,在程序执行期间不会改变。这些固定的值,又叫做字面量。常量可以是任何的基本数…

网络安全合规-DSMM

DSMM(Data Security Management Model)是一种数据安全管理模型。该模型以数据为中心,从数据的生命周期入手,从数据发布、使用、共享、存储、删除等几个方面来管理数据安全。 DSMM提供了一些有效的数据安全管理原则和策略&#xf…

ArcGIS Engine10.2 Setup 报错

00 问题重述 当我尝试安装ArcGIS Engine时弹出错误:ArcGIs 10,2 Engine cannot be installed on your machine.ArcGIs 10,2 Engine requires Microsoft ,NET Framework 3.5sp1, Which has not been found on your system, If you want to download and install Mic…

Ubuntu18.04系统下通过moveit控制kinova真实机械臂,并用python脚本到达固定点

测试工作空间:test_ws Kinova机械臂型号:m1n6s300 双臂模型中的左臂 测试功能包为kinova-ros官方包 一、读取kinova机械臂末端执行器位姿及tf小知识 1. tf小知识之获取两个连杆坐标系的位姿关系,非常有用,非常有用,非…

Unity中Shader的变体shader_feature(青莲地心火 o.o )

文章目录 前言一、变体的类型1、multi_compile —— 无论如何都会被编译的变体2、shader_feature —— 通过材质的使用情况来决定是否编译的变体 二、使用 shader_feature 来控制 shader 效果的变化1、首先在属性面板暴露一个开关属性,用于配合shader_feature来控制…

Flask狼书笔记 | 05_数据库

文章目录 5 数据库5.1 数据库的分类5.2 ORM5.3 使用Flask_SQLAlchemy5.4 数据库操作5.5 定义关系5.6 更新数据库表5.7 数据库进阶小结 5 数据库 这一章学习如何在Python中使用DBMS(数据库管理系统),来对数据库进行管理和操作。本书使用SQLit…

02JVM_垃圾回收GC

二、垃圾回收GC 在堆里面存放着java的所有对象实例,当对象为“死去”,也就是不再使用的对象,就会进行垃圾回收GC 1.如何判断对象可以回收 1.1引用计数器 介绍 在对象中添加一个引用计数器,当一个对象被其他变量引用时这个对象…

软件架构之前后端分离架构服务器端高并发演进之路

软件架构之前后端分离架构&服务器端高并发演进之路 前后端分离架构服务器端关于不同并发量的演进之路1. 单体架构2. 第一次演进:应用服务器和数据库服务器分开部署3. 第二次演进:引入本地缓存和分部署缓存4. 第三次演进:引入反向代理和负…

SQL语句如何生成PDM文件

首先我们先了解一下什么是PDM 物理数据模型(PDM)是数据库设计和管理过程中的重要组成部分,具有以下好处: 可视化数据库结构: PDM提供了一个直观的方式来可视化数据库的结构,包括表、列、索引、关系等。这使…

数据结构与算法学习(day4)——解决实际问题

前言 在本章的学习此前,需要复习前三章的内容,每个算法都动手敲一遍解题。宁愿学慢一点,也要对每个算法掌握基本的理解! 前面我们学习了简化版桶排序、冒泡排序和快速排序三种算法,今天我们来实践一下前面的三种算法。…

QT连接OpenCV库完成人脸识别

1.相关的配置 1> 该项目所用环境:qt-opensource-windows-x86-mingw491_opengl-5.4.0 2> 配置opencv库路径: 1、在D盘下创建一个opencv的文件夹,用于存放所需材料 2、在opencv的文件夹下创建一个名为:opencv3.4-qt-intall 文…

Android Glide in RecyclerView,only load visible item when page return,Kotlin

Android Glide in RecyclerView,only load visible item when page return,Kotlin base on this article: Android Glide preload RecyclerView切入后台不可见再切换可见只加载当前视野可见区域item图片,Kotlin_zhangphil的博客…

L1和L2正则

L1和L2正则 L1正则常被用来进行特征选择,主要原因在于L1正则化会使得较多的参数为0,从而产生稀疏解,我们可以将0对应的特征遗弃,进而用来选择特征。一定程度上L1正则也可以防止模型过拟合。 L2正则: L1损失函数相比于…

口袋参谋:淘宝卖家如何对订单实现批量标旗?

​插旗在淘宝店铺里是经常能使用到的,如果淘宝卖家订单量太大,一个一个的标旗太过于繁琐,而且容易出错。 那么使用批量插旗工具,则可以大大节省卖家时间,提高工作效率! 【批量插旗】功能: 一键…