C++链接和执行相关错误
http://blog.csdn.net/pipisorry/article/details/37610401
LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
错误:
在更新VS2010。或者卸载VS2012安装2010后。建立Win32 Console Project/MFC项目时会出现"LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏"的错误:
1>正在编译资源...
1>正在编译资源清单...
1>正在链接...
1>LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
1>生成日志保存在
解决方式:
第一步:
将 项目——项目属性——配置属性——连接器——清单文件——嵌入清单 “是”改为“否”。
若还不能解决这个问题进入第二步:
第二步:查看计算机是否为64bit操作系统,如是。继续例如以下操作。
查找是否有两个cvtres.exe。
C:\Program Files(x86)\Microsoft Visual Studio 10.0\vc\bin\cvtres.exe
C:\Windows\Microsoft.NET\Framework\v4.0.30319\cvtres.exe
右键属性—具体信息。 查看两者版本号号,删除/重命名较旧的版本号,或者又一次设置Path变量。
治本的办法是第二步。删除旧版本号的cvtres.exe后,就不须要每次都设置配置了。
VC++的链接错误LNK2005 已经在*.obj中定义
LNK2005错误——反复定义错误
形成的原因:
1. 反复定义全局变量。
可能存在两种情况:
A、 对于一些初学编程的程序猿,有时候会以为须要使用全局变量的地方就能够使用定义申明一下。事实上这是错误的。全局变量是针对整个project的。正确的应该是在一个CPP文件里定义例如以下:int g_Test;那么在使用的CPP文件里就应该使用:extern int g_Test就可以。假设还是使用int g_Test,那么就会产生LNK2005错误,一般错误错误信息类似:AAA.obj error LNK2005 int book c?book@@3HA already defined in BBB.obj。
切记的就是不能给变量赋值否则还是会有LNK2005错误。
这里须要的是“声明”,不是“定义”!依据C++标准的规定。一个变量是声明,必须同一时候满足两个条件,否则就是定义:
(1)声明必须使用externkeyword。(2)不能给变量赋初值
所以。以下的是声明:
extern int a;
以下的是定义
int a; int a = 0; extern int a =0;
B、对于那么编程不是那么严谨的程序猿,总是在须要使用变量的文件里任意定义一个全局变量,而且对于变量名也不予考虑,这也往往easy造成变量名反复。而造成LNK2005错误。
2. 头文件的包括反复。往往须要包括的头文件里含有变量、函数、类的定义。在其他使用的地方又不得不多次包括之,假设头文件里没有相关的宏等防止反复链接的措施,那么就会产生LNK2005错误。
解决的方法是在须要包括的头文件里做类似的处理:#ifndef MY_H_FILE //假设未定义这个宏
#define MY_H_FILE //定义这个宏
……. //头文件主体内容
…….
#endif
上面是使用宏来做的,也能够使用预编译来做,在头文件里增加:
#pragma once
//头文件主体
3. 使用第三方的库造成的。这样的情况主要是C执行期函数库和MFC的库冲突造成的。详细的办法就是将那个提示出错的库放到另外一个库的前面。
另外选择不同的C函数库,可能会引起这个错误。
微软和C有两种C执行期函数库,一种是普通的函数库:LIBC.LIB。不支持多线程。第二种是支持多线程的:msvcrt.lib。假设一个project里。这两种函数库混合使用。可能会引起这个错误,普通情况下它须要MFC的库先于C执行期函数库被链接。因此建议使用支持多线程的msvcrt.lib。
所以在使用第三方的库之前首先要知道它链接的是什么库,否则就可能造成LNK2005错误。假设不得不使用第三方的库。能够尝试按以下所说的方法改动。但不能保证一定能解决这个问题,前两种方法是微软提供的:
A、 选择VC菜单Project->Settings->Link->Catagory选择Input,再在Ignore libraries 的Edit栏中填入你须要忽略的库,如:Nafxcwd.lib;Libcmtd.lib。然后在Object/library Modules的Edit栏中填入正确的库的顺序,这里须要你能确定什么是正确的顺序,呵呵,God bless you!
B、 选择VC菜单Project->Settings->Link页,然后在Project Options的Edit栏中输入/verbose:lib。这样就能够在编译链接程序过程中在输出窗体看到链接的顺序了。
C、 选择VC菜单Project->Settings->C/C++页,Catagory选择Code Generation后再在User Runtime libraray中选择MultiThread DLL等其它库,逐一尝试。
关于编译器的相关处理过程,參考:
http://www.donews.net/xzwenlan/archive/2004/12/23/211668.aspx
4.在用第三方库时,因为errno被重定义,用多种方法都不能解决,后查找MSDN,发现link有个选项/FORCE能够解决,在IDE下
Project->Settings->Link页,选categroy为custom,将force file output前打勾
但会有警告
warning LNK4088: image being generated due to /FORCE option; image may not run
但的确攻克了问题,这是因为VC对重定义比較严格,像BCB或GCC在库中的重定义不会有不论什么警告或错误
5.另外一个出现LINK2005的现象。好像是由于名称空间而引起的。
我在dos下写的程序没有问题,可是放在mfc中就出现了这个链接错误。
由于起初图省事,我在一个头文件里写了using namespace std,而且这个头文件我多处使用,另外,我还使用了boost库。后来,问题解决办法很奇怪。在一个头文件里引用其它头文件,这些头文件的顺序换一下就通过了。那个出现故障的头文件里我使用了std::map,当我把这样的容器使用模板取代后。链接就有没事了。
(比如:template<class coll>),后来感到模板技术还有这样的效果
ps:这样的情况好像就是由于库的版本号冲突造成的。标准的C++库使用C执行期函数库。MFC使用了自己的C执行期函数库。调整头文件的顺序也就是调整链接库的顺序。
在这样的情况下通常是将MFC的执行期库放在前面就可以!
6.#pragma comment( linker, "/NODEFAULTLIB:msvcprtd.lib" )
#pragma comment( linker, "/NODEFAULTLIB:libcmtd.lib" )
#pragma comment( linker, "/NODEFAULTLIB:msvcprt.lib" )
#pragma comment( linker, "/NODEFAULTLIB:libcmt.lib" )
#ifdef _UNICODE
#pragma comment( linker, "/ENTRY:wWinMainCRTStartup" )
#endif
#ifdef _DEBUG
#pragma comment( lib, "cryptlibd" )
#else
#pragma comment( lib, "cryptlib" )
#endif
7.我的解决:
static char * strReverse(char *str);
引入的.cpp或,h文件里的函数前面加上static,执行成功!
!
!
[http://bbs.csdn.net/topics/70346371]
写入位置时发生訪问冲突
1:使用了未初始化的指针(未给指针分配空间)
2:使用了已经删除的指针
3.char str[]="ABCD"。这个数组的存储空间是在栈中开辟的(在栈中开辟了一个数组?)
char *str="ABCD"。str指向的是静态存储区。"ABCD"是位于常量区的。指针str仅仅是指向了这个位置(仅仅在栈中开辟了一个指针内存?),那么这些值就不能被改动。而上面数组中,要注意的是把字符拷贝到数组的元素中,那么就是能够被随意改动的。
例:
char* str = "ABCD"; //char str[] = "ABCD";能够解决
strrev(str);
char * strrev(char str[]){
int j, i;
for(i = 0, j = strlen(str) - 1; i < j; i++, j--){
char tmp = str[i];
str[i] = str[j];//写入位置时发生冲突
str[j] = tmp;
}
return str;
}
分析:
程序代码区:
1 //main.cpp
2 int a=0; //全局初始化区
3 char *p1; //全局未初始化区
4 main()
5 {
6 int b; //栈
7 char s[]="abc"; //栈
8 char *p2; //栈
9 char *p3="123456"; //123456\0在常量区,p3在栈上。
10 static int c=0; //全局(静态)初始化区
11 p1 = (char*)malloc(10);
12 p2 = (char*)malloc(20); //分配得来得10和20字节的区域就在堆区。
13 strcpy(p1,"123456"); //123456\0放在常量区,编译器可能会将它与p3所向"123456"优化成一个地方。
14 }
存取效率的比較
char s1[]="aaaaaaaaaaaaaaa";
char *s2="bbbbbbbbbbbbbbbbb";
aaaaaaaaaaa是在执行时刻赋值的。而bbbbbbbbbbb是在编译时就确定的;可是。在以后的存取中,在栈上的数组比指针所指向的字符串(比如堆)快。
form:http://blog.csdn.net/pipisorry/article/details/37610401
ref:
C++链接和执行相关错误的更多相关文章
- OpenStack虚机相关错误
OpenStack配置起来还是挺麻烦的,特别是网络那块.虽然官方文档越来越清晰,但有时还是会出各种错.排错主要是看日志.看官方文档和google 以下就一些虚机相关常见的错误做一下总结(基于Iceho ...
- 文件 "c:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\DATA\ttt.mdf" 已压缩,但未驻留在只读数据库或文件组中。必须将此文件解压缩。 CREATE DATABASE 失败。无法创建列出的某些文件名。请查看相关错误。 (.Net SqlClient Data Provider)
问题: 文件 "c:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\DATA\ttt.mdf" 已压缩,但 ...
- Linux 下Redis集群安装部署及使用详解(在线和离线两种安装+相关错误解决方案)
一.应用场景介绍 本文主要是介绍Redis集群在Linux环境下的安装讲解,其中主要包括在联网的Linux环境和脱机的Linux环境下是如何安装的.因为大多数时候,公司的生产环境是在内网环境下,无外网 ...
- mysql 链接数满了的错误 ERROR 1040 (HY000): Too many connections
mysql 链接数满了的错误 ERROR 1040 (HY000): Too many connections 第一种处理方式: ./mysql -u root -p 登录成功后执行以下语句查询当前的 ...
- 用JDBC编程的执行时错误及其解决大全
用JDBC编程的执行时错误及其解决 用JDBC编程的执行时错误及其解决 源码: .java.lang.ClassNotFoundException: com.microsoft.jdbc.sqlser ...
- C#需要在项目程序生成前后执行相关的事件
分享4: 需求:需要在项目程序生成前后执行相关的事件,比如:需要将某个文件拷贝到bin\Debug中,或者创建某文件夹等. 分析:我们可利用项目属性(选择项目右键,选择属性)中的“生成事件”预定义相关 ...
- 脚本可执行,但无HTML测试报告文件生成,其造成的原因是在PyCharm的执行模式错误
定义测试报告两种写法: 1)测试报告直接在本地绝对路径下生成 # 导入HTMLTestRunner模块 import HTMLTestRunner # 通过open()方法以二进制写模式('wb')打 ...
- 在RAC执行相关操作发生ora-01031:insufficient privileges解决方法
grid用户下 寻找命令的路径 如which crsctl su - root用户 然后根据找到的路径去执行命令 如 /u01/app/oracle/product/11.2.0/db_1/bin/c ...
- NET Runtime version 2.0.50727.42 - 执行引擎错误 或者无法创建应用程序域
server2003操作系统 IIS运行应用程序报错,应用程序事件查看器详细: NET Runtime version 2.0.50727.42 - 执行引擎错误 或者无法创建应用程序域 解决方法:卸 ...
随机推荐
- Spring进阶之路(10)-Advice简单介绍以及通过cglib生成AOP代理对象
Advice简单介绍 1. Before:在目标方法运行之前运行织入.假设Before的处理中没有进行特殊的处理.那么目标方法终于会运行,可是假设想要阻止目标方法运行时.能够通过抛出一个异常来实现.B ...
- spring batch(二):核心部分(1):配置Spring batch
spring batch(二):核心部分(1):配置Spring batch 博客分类: Spring 经验 java chapter 3.Batch configuration 1.spring ...
- HDU 1874 畅通project续 (最短路径)
畅通project续 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- poj - 1159 - Palindrome(滚动数组dp)
题意:一个长为N的字符串( 3 <= N <= 5000).问最少插入多少个字符使其变成回文串. 题目链接:http://poj.org/problem?id=1159 -->> ...
- php常用知识集锦
php常用知识集锦 很多位置都有写好的代码,自己做项目的时候可以直接拿来用,而不用自己写,比如现在看到的菜鸟教程. 1.判断是否为空 empty($_POST["name"]) 2 ...
- Python 加载数据
1. numpy data = np.loadtxt('./data/txtdata.csv') ⇒ data 是 numpy.ndarray 类型
- [MySQL] 统计函数记录
时间段统计========== 按年汇总,统计:select sum(mymoney) as totalmoney, count(*) as sheets from mytable group by ...
- 淘宝druid报错:javax.management.InstanceNotFoundException: com.alibaba.druid:type=DruidDataSourceStat
问题: 启动tomcat报错: Tomat报出一下异常:ERROR [com.alibaba.druid.stat.DruidDataSourceStatManager] – unregister m ...
- vue中使用Ueditor编辑器 -- 1
一. 下载包: 从Ueditor的官网下载1.4.3.3jsp版本的Ueditor编辑器,官网地址为:http://ueditor.baidu.com/website/download.html ...
- C/C++中的函数指针
C/C++中的函数指针 一.引子 今天无聊刷了leetcode上的一道题,如下: Median is the middle value in an ordered integer list. If t ...