目录
fatal error LINK1123:failure during conversion to COFF:file invalid or corrupt
确保编辑出来的库文件可以在其它语言环境中可以用,比如在C#中
sdf .vs文件夹
与智能提示、错误提示、代码恢复等信息有关,
可以选择关闭或重设路径
Tools —— Options —— Text Editor —— C/C++ —— Advanced ——Disable Database 设置为True,默认为false,这样就没了
或者
文件设置不了断点
文件设置不了断点,多是文件内的不可视符出了问题,比较多的是制表符tab(0x09)引起的,可在VC内CTRL+A后,菜单-编辑-高级-设定选定内容的格式改过来
每次都要重新编译
大多数情况是系统时间被修改成为了以前的时间了
生成后事件
copy "$(TargetDir)\$(TargetName).dll" "$(SolutionDir)\..\$(Configuration)\"
copy "$(TargetDir)\$(TargetName).lib" "$(SolutionDir)lib"
xcopy "$(ProjectDir)*.h" /D/S/E/Y "$(SolutionDir)include\"
copy "$(TargetDir)\$(TargetName).dll" "$(SolutionDir)\..\..\res\milestone\"
copy "$(TargetDir)\$(TargetName).dll" "$(SolutionDir)\..\test_debug\"
xcopy "E:\UsefulPublicFunc\*.h" /D/S/E/Y "$(ProjectDir)\ExternFile\"
xcopy "E:\UsefulPublicFunc\*.cpp" /D/S/E/Y "$(ProjectDir)\ExternFile\"
fatal error LINK1123:failure during conversion to COFF:file invalid or corrupt
试了很多方法都没有用,包括微软官方的说明
开始以为自己的项目文件有问题,可以通过编译选项回避,后来新建一个新的空C/C++项目,发现也是相同的问题,知道是VS环境出问题了。
继续调查发现原来是VS用来进行COFF格式转换的工具cvtres.exe被破坏了。
在命令行下直接执行cvtres.exe,就弹出窗口说进程启动失败。
而cvtres.exe被破坏的原因是因为我刚装了.Net Framework 4.5,.Net Framework 4.5自带了一个更新的cvtres.exe,却让原来VS2010中的cvtres.exe动不起来了。并且在VS编译时,VS自带的cvtres.exe在PATH环境变量的前面,所以COFF转换失败(不过VS报的错误太误导人了)。
VS2010中的cvtres.exe(已经坏了)
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\cvtres.exe
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64\cvtres.exe
.Net Framework 4.5安装的cvtres.exe(可以用)
C:\Windows\Microsoft.NET\Framework\v4.0.30319\cvtres.exe
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\cvtres.exe
知道原因就很好解决了。把VS2010中的两个cvtres.exe删掉或改名字,让VS可以使用.Net Framework 4.5安装的cvtres.exe,就OK了。
生成动态库时,只有dll,lib文件没有
法1:
在工程上右键 -> 添加 -> 新建项 -> 选"模块定义文件(.def)" -> 随便输入个名字 -> 添加
现在编译就可生成.lib 文件了,然后把添加的文件删除,以后都没问题了.
如果上边的操作是添加现有项,不能产生(.lib)的问题依旧存在.
法2:
在工程上点击右键,然后选择properties,进入后在左侧的树形目录中选择Linker->General
然后要保证Enable Incremental Linking (从上往下数是第四项)选项选择(Yes (/INCREMENTAL));
Ignore Import Library(第六项)选择No;
Link Library Dependencies (倒数第二项)选择YES;
确保编辑出来的库文件可以在其它语言环境中可以用,比如在C#中
1.要以上一主题的def文件方式来导出外部函数例:
外部函数的头文件PublicDll
#pragma once
#define ExternAPI __declspec(dllexport)
extern "C"
{
//需要一个16位密码
ExternAPI void TeaEnter(const unsigned char* key);
//enMaxLen=(1+(dataLen+7)/8)*8
ExternAPI int TeaEncyptData(unsigned char* dataBuff, int dataLen, unsigned char* enBuff, int enMaxLen);
//deMaxLen<enLen
ExternAPI int TeaDecyptData(unsigned char* enBuff, int enLen, unsigned char* deBuff, int deMaxLen);
ExternAPI void TeaExit();
ExternAPI unsigned int FileLen(const char* filePath);
ExternAPI unsigned int FileLoad(const char* filePath, unsigned char* fileTxt, unsigned int txtMaxLen);
//0 网卡原生MAC地址
//3 CPU ID
//5 主板型号
ExternAPI int GetPCSerialCodeNumber(char* codeBuff, int maxLen);
ExternAPI int GetTextMD5(const unsigned char* txtBuff, int len, unsigned char* md5_str, unsigned int maxLen);
}
def文件
EXPORTS
TeaEnter @ 1
TeaEncyptData @ 2
TeaDecyptData @ 3
TeaExit @ 4
FileLen @ 5
FileLoad @ 6
GetPCSerialCodeNumber @ 7
GetTextMD5 @ 8
2.C#中的引用,我生成了debug和release的两个版库
public class SerialNum
{
#if DEBUG
[DllImport("PublicDll_D.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
#else
[DllImport("PublicDll.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
#endif
public static extern int GetPCSerialCodeNumber(
[In, Out][MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)]byte[] codeBuff, uint maxLen);
}