转VC各种问题

来源:互联网 发布:黑马 软件测试培训 编辑:程序博客网 时间:2024/04/29 03:00
2012-04-19 11:16

实习中出现的若干问题

1.VS2008如何为工程添加lib文件

工程中引用DLL时,有时需要添加lib文件,VS2008中添加LIB文件与VC6中不太一样,操作如下:

 

VS2008中如何加lib引用  lib引用有两种方法: 
1.#pragma comment(lib,"opengl32.lib")

 

2.选择project --> XX properties... --> linker --> Input --> Additional dependences,在其中加入lib文件名即可。

文章转载于:http://blog.csdn.net/wangfaqiang/article/details/5925790

 

2.oracle数据库操作出现错误码:ORA-00911: 无效字符   注意写sql语句的时候不要带上;,否则就会报这个错误。 

3.在oracle控制台上插入数据,应该在insert语句后再添加SQL> commit;如果没有则记录只是添加到缓存中,并不是添加到数据库中。

 4.testcocoon的使用( "覆盖率工具TestCocoon.one" http://vdisk.weibo.com/s/4XKfb )

  • 使用基本流程

TestCocoon主要分为两个处理过程,插桩、结果展示。其中,插桩过程中会产生两个文件,一个是csmes文件,另一个是exe文件,csmes文件相当于一个描述信息文件,比如记录有哪些源码文件,以及某些exe输出信息代表什么含义等等,exe文件就是我们的可执行程序,是由插桩后代码生成的,通过运行该exe文件会生成一个记录执行过程的结果文件,csexe文件;当将csmes、csexe文件在结果浏览程序中打开后,就可以看到具体的覆盖率信息,代码的执行信息。 

源文档 <http://blog.csdn.net/ybb_y1b1b1/article/details/6735978>

  • 示例(windows)

本节以STCL(类OO4O)工程为例,说明使用该工具的具体步骤。

示例相关环境信息:

操作系统

Windows

语言

C++

编译器

Visual Studio 2008

 

  • 插桩

插桩是在编译过程中进行的,因此要在编译过程中使用TestCocoon提供的编译器,TestCocoon支持两种编译方式:一是命令行编译,一是使用IDE(TestCocoon提供了vc插件)

  • 命令行方式

  • 设置环境变量

"%VS90COMNTOOLS%"\vsvars32.bat

setPATH=%TESTCOCOON%\visualstudio;%PATH%

set COVERAGESCANNER_ARGS=--cs-on

说明:

"%VS90COMNTOOLS%"\vsvars32.bat

Setting environment for using Microsoft Visual Studio 2008 x86 tools.

set PATH=%TESTCOCOON%\visualstudio;%PATH%

TestCocoon对vc的编译器进行了封装,比如cl,link,它会对代码进行插桩,然后再调用真实的编译器进行编译。对vc封装命令放在%TESTCOCOON%\visualstudio目录下,本语句是将该目录放到PATH路径前面,使下面编译时使用包装过的命令进行编译(需要devenv命令的/useenv参数配合)。

set  COVERAGESCANNER_ARGS=--cs-on

TestCocoon封装的命令需要打开--cs-on开关才会进行插桩,这些开关选项可以放在COVERAGESCANNER_ARGS环境变量中。如果需要了解其它选项可以参考帮助手册。

  • 编译

devenv stcl.sln /rebuild Debug /project StclTest /useenv

编译完以后会生成可执行文件(exe)和插桩数据库文件(csmes),对于本本示例,会生成stclm32.dllStclTest.exe stclm32.lib.csmes StclTest.exe.csmes 。生成stclm32.dll 和 stclm32.lib.csmes是因为StclTest工程依赖stcl工程,使得stcl工程也同时被编译。

说明:

devenv

visual studio IDE的启动命令,可以从从命令行编译工程项目

stcl.sln

解决方案文件名,此例中是stcl的解决方案,需要替换成你自己的解决方案文件名。

/rebuild Debug

重新编译Debug版本,类似的可以使用 

/build Debug  编译Debug版本

/rebuild Release 重新编译Release版本

/build Release 编译Release版本

/project StclTest

选择编译的工程,其行为与在IDE中对指定工程进行编译类似,它所依赖的工程也会被编译。本例中是StclTest工程,需要替换成你自己的工程。

/useenv

使用环境变量而不是IDE路径,一定要使用该选项,它使编译过程从PATH路径中查找cl,Link等命令,这样前面设置的PATH路径才能起作用。

  • IDE插件方式

  • TestCoCoon在中文版visual studio上的插件存在问题,尚未深入研究。

  • 运行

  • 运行生成的可执行程序

cd Debug

.\StclTest.exe

程序运行退出后,会生成csexe覆盖结果文件,其名字默认为coverage.csexe。该文件名可以在代码中修改,具体方法请参考帮助手册。

  • 查看结果

  • 命令行方式生成报告

  • 导入执行结果

cmcsexeimport--csmes=stclm32.lib.csmes --csexe=coverage.csexe --title=stclunittest

 

该命令将执行结果(csexe)导入到插桩数据库(csmes)中,为下一步生成报告做准备。

--csmes 

用于指定插桩数据库

--csexe 

用于指定执行结果

--title 

用于指定标题

 

  • 生成报告

cmreport--csmes=stclm32.lib.csmes --select=.*--html=report.html --method=all --source=all--global=all --title=StclCoverage --unexecuted 

 

--csmes 

用于指定已导入执行结果的插桩数据库(参考上节,使用cmcsexeimport导入执行结果)

--select 

用于选择生成哪些执行结果的报告。注意:--select参数后面是正则表达式,而不是通配符,例如全选应当使用 .*(点星号),不能只写一个 *(星号)

--html 

指定生成html格式报告,并指定文件名

--method 

指定报告中包含哪些函数

--source

指定报告中包含哪些文件

--global 

指定包含哪些全局覆盖率信息

--title  

指定报告标题

--unexecuted

 报告中列出未执行的代码

图形界面查看方式就不列举了

5.静态链接库(Lib)与动态链接库(DLL)的区别(转自http://blog.sina.com.cn/s/blog_4b44e1c00100comy.html

静态连接库就是把(lib)文件中用到的函数代码直接链接进目标程序,程序运行的时候不再需要其它的库文件;动态链接就是把调用的函数所在文件模块(DLL)和调用函数在文件中的位置等信息链接进目标程序,程序运行的时候再从DLL中寻找相应函数代码,因此需要相应DLL文件的支持。  

 

    静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了。但是若使用 DLL,该 DLL 不必被包含在最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与 EXE 独立的 DLL 文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。


   “每一个lib文件就是若干函数(假设只有函数)的定义”  
    lib库有两种,一种是包含了函数所在DLL文件和文件中函数位置的信息,称为导出库;一种是包含函数代码本身,一般现有的DLL,用的是前一种库;以前在DOS下的TC/BC等,是后一种库。包含函数原型声明的,是头文件(.h)。  
   
    “通过#include包含这些函数声明的头文件后,我们的应用程序就可以使用lib文件中的函数”  

     还要指定编译器链接相应的库文件。在IDE环境下,一般是一次指定所有用到的库文件,编译器自己寻找每个模块需要的库;在命令行编译环境下,需要指定每个模块调用的库。  
   
   “那他和直接给出那个函数定义的文件,比如.cpp文件,和头文件有什么区别,静态链接库有什么用”  
    cpp文件是源代码,库文件是编译后的二进制代码,比如你可以调用Windows的API,但是不能看到其源代码一样。  

6.strncpy的用法及与strcpy的区别http://baike.baidu.com/view/1207711.htm?fromTaglist

7.strstr的用法http://baike.baidu.com/view/745156.htm

8.字符串处理函数http://zhwen.org/tools/clib/string/strupr.html

9.dos下的有关操作以及批处理

          dos下快速切换工作目录cd d/ F:\ACI_llf\externals


           ::保存当前路径

         dos下批处理文件中,设置变量set var=%CD%   

         ::当前批处理的路径          %0


          引用所声明的变量为%var%

         set /p var=请输入var变量的值  

          echo 输入变量的值为:%var%

10.volatile修饰符的作用并与const的区别http://baike.baidu.com/view/608706.htm

11.oracle下的命令

           oracle登录sqlplus system/123456

           显示数据库中所有表select * from tab where tabtype = 'TABLE' 

12.当出现如下问题时

1>c:\program files\microsoft sdks\windows\v6.0a\include\rpcndr.h(156) : error C2632: “char”后面的“int”非法
1>c:\program files\microsoft sdks\windows\v6.0a\include\rpcndr.h(156) : warning C4091: “typedef ”: 没有声明变量时忽略“unsigned char”的左侧
1>c:\program files\microsoft sdks\windows\v6.0a\include\wtypes.h(1117) : error C2371: “BOOLEAN”: 重定义;不同的基类型

 

基本上是头文件包含顺序出现问题,只需将系统头文件先包含。

 

// HeadContain.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "a.h"
#include "b.h"
#include <string>
#include <Windows.h>
#include <time.h>
using namespace std;

/*
HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,
     DWORD dwStackSize,
     LPTHREAD_START_ROUTINE lpStartAddress,
     LPVOID lpParameter,
     DWORD dwCreationFlags,
     LPDWORD lpThreadId);
*/

volatile bool m_bRun;

DWORD WINAPI  MyFuncThrd(void)
{
 time_t tm;
 string strTime;
 m_bRun=TRUE;
 while(m_bRun)
 {
  tm=time(&tm);
  struct tm *tblock; 
  tblock = localtime(&tm); 
  strTime=asctime(tblock);
  printf("Local time is: %s\n",asctime(tblock)); 
  Sleep(1000);
 }
 return 0;
}

DWORD WINAPI  MyFuncThrd2(void)

 m_bRun=FALSE; 
 while(!m_bRun)
 {
  printf("执行MyFuncThrd2\n"); 
  Sleep(1000);
 }
 return 0;
}

int _tmain(int argc, _TCHAR* argv[])

 int i=0;
 LPDWORD lpThrdID=NULL,lpThrdID2=NULL;
 lpThrdID=(LPDWORD)malloc(sizeof(DWORD));
 lpThrdID2=(LPDWORD)malloc(sizeof(DWORD));

 HANDLE  hMyThrd=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)MyFuncThrd,NULL,0,lpThrdID);
 HANDLE  hMyThrd2=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)MyFuncThrd2,NULL,0,lpThrdID2);
 return 0;
}

 、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

#include "stdafx.h"
#include <string>
#include <Windows.h>
#include <time.h>
#include<iostream>
using namespace std;

volatile int count=0;

DWORD WINAPI  MyFuncThrd(void)
{
 printf("Local time is: %d\n",count); 
 Sleep(1000);
 return 0;
}

DWORD WINAPI  MyFuncThrd2(void)
{  
 printf("执行MyFuncThrd2\n"); 
 Sleep(1000);
 return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
 int i=0;
 LPDWORD lpThrdID=NULL,lpThrdID2=NULL;
 lpThrdID=(LPDWORD)malloc(sizeof(DWORD));
 lpThrdID2=(LPDWORD)malloc(sizeof(DWORD));

 HANDLE  hMyThrd=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)MyFuncThrd,NULL,0,lpThrdID);
 HANDLE  hMyThrd2=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)MyFuncThrd2,NULL,0,lpThrdID2);
 return 0;
}

 

上半年工作总结:从4月中旬到5月下旬实习期间,主要通过测试ACI游标接口和覆盖率熟悉各接口功能及实现。

下半年工作计划:通过测试和bug修改等达到对ACI有整体的认识,并且编程能力有质的提高。

上半年工作总结:从4月中旬到5月下旬实习期间,主要通过测试ACI游标接口和覆盖率熟悉各接口功能

及实现。

vi的操作及与vim的区别http://zjf30366.blog.163.com/blog/static/41116458201031435955731/

 

函数指针:http://www.newty.de/fpt/index.html

http://blog.163.com/daniel_won/blog/static/1728414582011510103315339/

麻生希


http://www.ibm.com/developerworks/cn/linux/l-cn-makefile-ext/index.html

http://easwy.com/blog/archives/easwy-vimrc-and-vim-settings/

http://www.crazyshell.org/blog/

原创粉丝点击