VS笔记(1)

1、 VS2012的安装步骤

先安装程序en_visual_studio_ultimate_2012_x86_dvd_920947.iso

再安装更新包VS2012.3

安装VS助手Visual Assist X

2、 对于只有.h与.cpp文件的代码,可以新建一个带有预编译头的控制台程序(一般都是控制台,但有特殊情况),将stdafx与main函数所在文件内容进行复制,并添加其他.h与.cpp文件,编译运行即可。

3、 Error 2019出现的原因是能找到头文件,但无法找到lib库,一般情况下CMake里面增加openCVlib就可以了

	此时,可以设一下cmake(以opencv为例)的INCLUDE_DIRECTORIES(
	    ${Include_Root}
	    ${CMAKE_CURRENT_SOURCE_DIR}
	    ${LOG4CPLUS_DIR}/include
            ${OPENCV_DIR}/build/include
            ${OPENCV_DIR}/build/include/opencv
	   ${OPENCV_DIR}/build/include/opencv2
	  )
	LINK_DIRECTORIES(
	   ${Lib_Root}/${ConfigurationName}
	   ${LOG4CPLUS_DIR}/lib
	   ${ITK_DIR}/lib/${ConfigurationName}
           ${OPENCV_DIR}/build/x64/vc11/lib
	)
	TARGET_LINK_LIBRARIES(OpLayer
	    Common
	    Utility
	    CommonInfo
	    Models
	    DataObject
	    debug log4cplusD
	    optimized log4cplus
	    CoordinateTranslator
	    CT3DDisplayModel	
	    ITKCommon-4.10
	    ITKIOImageBase-4.10
            ITKVTK-4.10
	    itkvnl_algo-4.10
	    itkvnl-4.10
	    itknetlib-4.10
	    itkv3p_netlib-4.10
	    itkvcl-4.10
	    itksys-4.10
	    vtkRenderingVolume-6.0
	    vtkIOLegacy-6.0
	    vtkIOCore-6.0
	    opencv_core249.lib
	    opencv_imgproc249.lib
	    opencv_calib3d249.lib
	    opencv_features2d249.lib
	    opencv_flann249.lib
	    opencv_highgui249.lib
            opencv_legacy249.lib
	    opencv_ml249.lib
	    opencv_video249.lib

如果还是不可以,可能是是该类没有导出的原因,此时应加xx_EXPORTOPLAYER_EXPORT,表示生成到lib中,让其他工程可以引用。

如果还是不可以,可能是生成的lib错误,此时可以删除该lib,重新编译生成,也可以删除之后,选择update(SVN)该lib。

4、如果是自己写的代码无法解析,则有可能是:

(1) 代码所在功能没有导出,导致无法跨工程引用.

(2)需要调用代码的功能没有依赖代码所在工程,在cmake中添加lib引用,再次生成即可。

5、 设置lib文件时不但要在Properties/Linker/Input/AdditionalDependencies 添加lib的名字如opencv_video249.lib,还要在Properties/Linker/General/Additional Library Directiories 添加lib所在目录。

6、设置一个新的工具时(VTK、Opencv),头文件与库文件是必须要设置的。

包含头文件的设置为在Properties/C/C++/General/ Additional IncludeDirectories 添加.h文件所在目录。

7、如选用的是64位的Opencv,则VS的编译器必须是X64,如果选择win32则会出现找不到库文件的各种问题。有时VS默认将编译器选为win32,特别需要注意将编译器改为x64。

8、 VS要显示在debug模式下的调试信息

      C/C++/general/Program Database (/Zi) : Program Database (/Zi)

     C/C++/optimization/Disabled (/Od)

     选中项目,右键->Properties->Configuration Properties->Debugging->Command

    默认为$(TargetPath)

9、VS 显示什么模式必须有对应的cMake生成的库,否则会报找不到文件等问题

CMake生成工程时,CMakeLists.txt里有该工程第三方库的路径设置,包括库与头文件等,且一般设置为if else 语句,即如果不在cMake的


里面指定,则会按cMake里的路径对VS进行设置,所以保险起见,每个第三方库都应在cMake的路径设置里。另外头文件在cMake的CMakeLists.txt是有路径设置的,如果工程运行时显示找不到头文件,可以对应一下CMakeLists.txt里的路径与实际是否一致。

10、VS设置命令行参数位置:Property/Debugging/CommandArguments

11、.h文件中添加如Model_EXPORT,表示为导出类,编译后该类与所有包含Model_EXPORT字样的类生成model.lib文件。

12、导出类之间的依赖关系不是随意的,有些外层类不适合作为导出类,因为身处外层,不适合被其它类依赖,而且两个导出类不能互相依赖,它们的编译顺序是有先后的。先后顺序可以在cmake文件中看到。

13、VS左侧设置为SolutionExplorer,则.cpp与.h文件可以正常显示

14、项目中加入第三方库CrashRpt之后,系统崩溃的时候,可以在bin的相应目录下找到 ErrorReport 文件夹, Logs下面的第一个文件夹中存有相关崩溃信息。可以再次进行调试。

15MVC框架传Model要从外往里传,很少平级之间传送,所以用SetModel()传。

Panel里面主要是布局,一般不涉及逻辑,对应的Controller肯定可以获取到对应的Panel,可以一般进行逻辑设计。Panel里的model一般是从对应的Controller传进的。

整明白model之间的传送顺序,才可以获取model

16RelWithDebInfo下选择工程所在属性、选择C/C++优化,优化选项选择Disabled,可以看到更多调试信息

16MVC框架中一般只有ViewController可以访问到自己的oplayer,oplayerPanel之间是不通信的,并且使用较多的是Model

17DxFTT2D3DMainController.cpp 中有很多SetModel,比较公用的model都是在此set的,是较多model的起点。

18、改变窗宽窗位实际改变的是lookuptable,将目标像素区域的灰度级颜色细化,其余不感兴趣的灰度值置成背景。

19page 是包括panelsidepanel的整页

20、在对应工程的DxFTT2D3DMainController里面找page的建立,MainController比较底层,公共,控制所有的controller

21、包含头文件的目录问题

包含头文件是相对目录,在cmake里添加(以opencv为例)

INCLUDE_DIRECTORIES(
    ${Include_Root}
    ${CMAKE_CURRENT_SOURCE_DIR}
    ${LOG4CPLUS_DIR}/include
    ${OPENCV_DIR}/build/include
    ${OPENCV_DIR}/build/include/opencv
    ${OPENCV_DIR}/build/include/opencv2
)

LINK_DIRECTORIES(
    ${Lib_Root}/${ConfigurationName}
    ${LOG4CPLUS_DIR}/lib
    ${ITK_DIR}/lib/${ConfigurationName}
    ${OPENCV_DIR}/build/x64/vc11/lib
)

就可以直接写#include <cv.h>

opencv_core249.lib

opencv_imgproc249.lib

opencv_calib3d249.lib

opencv_features2d249.lib

opencv_flann249.lib

opencv_highgui249.lib

opencv_legacy249.lib

opencv_ml249.lib

opencv_video249.lib

22、RelWithDebug版本的编译满足既快速又可以调试的优点,写代码时,如只想调试某一个或某几个工程,此时可以打开调试工程的属性->C/C++->Optimization-> Optimization->Disabled,然后重新编译这一(些)工程,则可以看到这几个工程的调试信息。如选择MaximizeSpeed,则速度最快,但没有调试信息。

23、一个new对应一个delete,set之后,两个cpp文件中的实例是同一个,所以一个delete,如进行两次删除会报错。

24view与对应的oplayer的关系为:view相对比较底层,依赖的库较少,Oplayer依赖的库较多。

25、模板类不能导出

26LNK2005 是重定义问题,我遇到的解决方案,将一个Inline函数由.h文件移至.cpp之后就好了

27、一个项目中可以有很多工程,在每个工程里均有cmake文件,在Source最外层的cmake里写哪个工程名,代表要重新编译该工程,生成相应的dll与lib,没有提到的工程则表示不重新编译。所以如果修改不执行编译的.h或.cpp文件,需在cmake中重新添加改工程,否则将报错。

28、 为什么指针变量定义时一定要初始化? 
因为你首先要理解一点.内存空间不是你分配了才可以使用, 只是你分配了之后使用才安全,为什么要进行对他初始化呢
因为,如果你没对他初始化,而引用这个指针并却其指向的内存进行修改 因为指针未被初始化,所以指针所指向的也是随机的,他是个野指针,如果你引用指针,并修改这个指针所指向的内容,而如果这个指针所指向的内容恰好是另外一个程序的数据的话,你将其进行修改了,就会导致另外一个程序可能不能正常运行了.所以使用前一定要进行初始化

29、指针变量初始化为NULL是什么意思?

答:意思是说,强指针变量置空,初始化为NULL,使它不指向任何内容,这样引用她也不会出现上面的问题

30、

new出来的放到堆中,需要程序员自己维护内存,不是局部变量,函数调用结束后,内存不会自动释放。

delete 是C++中释放内存的运算符
 1)C++程序员需要自己维护堆的内存;
2)堆的空间远大于栈,栈是系统自己维护的;
3)堆中申请内存是用new;
4)delete是专门用来释放用new申请的对象或者内存的。

delete 之后,下次再重新申请的时候可以再申请这块 内存地址 ,也就是将这块地址放到了空闲链表上,对于这块地址的内容, 没有进行清空处理 (也没有必要);由于你没有 将p赋为NULL ,所以p指针还是指向这块内存空间。 如果不delete的话,你这块内存是不能在申请使用的,也就是所谓的内存泄露 对于delete之后的指针p,此时是“野指针”

一般的正确做法是:
int * p = new int ;
if (p == NULL)(千万不要忘了这句话!!!)
{
//判断是否为空!使用空指针是不对的!!
}
delete p;
p = NULL;(千万不要忘了这一句话!!)
31、   new 出来的指针可能为null吗?

使用 malloc/calloc 等分配内存的函数时,一定要检查其返回值是否为空指针(亦即检查分配内存的操作是否成功),这是良好的编程习惯,也是编写可靠程序所必需的。但是,如果你简单地把这一招应用到 new 上,那可就不一定正确了。我经常看到类似这样的代码:

 int* p = newint[SIZE];
     if ( p == 0 ) // 检查 p 是否空指针
     return -1;
     // 其它代码

  其实,这里的 if ( p == 0 ) 完全是没啥意义的。C++ 里,如果 new 分配内存失败,默认是抛出异常的。所以,如果分配成功,p == 0 就绝对不会成立;而如果分配失败了,也不会执行 if ( p == 0 ),因为分配失败时,new 就会抛出异常跳过后面的代码

if(int):int非零即真

32、VS快速定位到代码的某一行:ctrl + G

33、Q_ASSERT(bool) bool为假的时候程序终止运行,弹框报错,输出文件名与错误代码行数,但只对dubug版有效。

34、

cmake语句如下:

FIND_PATH(ZLIB_DIR_ROOT"" "" NO_DEFAULT_PATH)

IF(ZLIB_DIR_ROOT)

SET(ZLIB_DIR"${ZLIB_DIR_ROOT}")

ELSE()

SET(ZLIB_DIR"${CMAKE_CURRENT_SOURCE_DIR}/Thirdparty/$(PlatformName)/zlib")

ENDIF()

表示第三方库zlib如不在cmake中重新指定路径则按照预先设定的路径/Thirdparty/$(PlatformName)/zlib

工程显示找不到第三方库的Lib.h文件都是路径不匹配的问题,仔细检查就可以找到原因。

工程报错loadlibrary failed with error 193:%1 不是有效的win32应用程序,原因:工程是32位的,但存在64位库。

Cmake 运行时如指定32位,则需要所有的三方库都是32位,当然像vtkitk等库是没有3264之分的。

35、

Q_OBJECT宏的作用:

只有加入了Q_OBJECT,你才能使用QT中的signalslot机制。

不加而直接使用有可能出现Error  2019的错误。

36、写代码时尽量保证同一功能的一致性,比如离开画轮廓界面再返回之后,统一规定成界面可编辑或不可编辑。不要“上一步”“下一步”编辑状态不一致。对于上一步”“下一步的控制问题

如设置轮廓lock状态:

在轮廓界面点击下一步之前,保证lock的标志位设好,则点击下一步,在返回该界面,都是lock的。

如果要在轮廓界面点击上一步,此时需要在上一步的对应代码中设置标志位为Lock,则可保证再次回到该界面为locked的。

 原则,从最近的地方改。

 尽量不要写一些零散的代码,如SetCurosor,可在GetDefaultCursor函数中写分支分情况返回Cursor.

 不到万部得以,不要修改已经成型的基类,带来的影响太多,如下必须改,则需要限定范围,不要涉及到其他子类,保证只对目标子类生效。

37、编译:把用高级程序设计语言书写的源程序,翻译成等价的计算机汇编语言机器语言书写的目标程序的翻译程序。

38、dll与lib的区别:
关于lib和dll的区别如下:
(1)lib是编译时用到的,dll是运行时用到的。如果要完成源代码的编译,只需要lib;如果要使动态链接的程序运行起来,只需要dll。

(2)如果有dll文件,那么lib一般是一些索引信息,记录了dll中函数的入口和位置,dll中是函数的具体内容;如果只有lib文件,那么这个lib文件是静态编译出来的,索引和实现都在其中。使用静态编译的lib文件,在运行程序时不需要再挂动态库,缺点是导致应用程序比较大,而且失去了动态库的灵活性,发布新版本时要发布新的应用程序才行。

(3)动态链接的情况下,有两个文件:一个是LIB文件,一个是DLL文件。LIB包含被DLL导出的函数名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到DLL文件。在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中相应函数代码的地址,从而节省了内存资源。DLL和LIB文件必须随应用程序一起发行,否则应用程序会产生错误。如果不想用lib文件或者没有lib文件,可以用WIN32API函数LoadLibrary、GetProcAddress装载。

使用lib需注意两个文件:
(1).h头文件,包含lib中说明输出的类或符号原型或数据结构。应用程序调用lib时,需要将该文件包含入应用程序的源文件中。
(2).LIB文件,略。
使用dll需注意三个文件:
(1).h头文件,包含dll中说明输出的类或符号原型或数据结构的.h文件。应用程序调用dll时,需要将该文件包含入应用程序的源文件中。
(2).LIB文件,是dll在编译、链接成功之后生成的文件,作用是当其他应用程序调用dll时,需要将该文件引入应用程序,否则产生错误。如果不想用lib文件或者没有lib文件,可以用WIN32API函数LoadLibrary、GetProcAddress装载。

(3).dll文件,真正的可执行文件,开发成功后的应用程序在发布时,只需要有.exe文件和.dll文件,并不需要.lib文件和.h头文件。

目中使用第三方库一般需要用到dlllib.h文件


猜你喜欢

转载自blog.csdn.net/zzhouzhou237/article/details/80447081