Visual Stdio使用的技巧汇总

目录

sdf .vs文件夹

文件设置不了断点

每次都要重新编译

生成后事件

fatal error LINK1123:failure during conversion to COFF:file invalid or corrupt

生成动态库时,只有dll,lib文件没有

确保编辑出来的库文件可以在其它语言环境中可以用,比如在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);
    }

批量生成

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值