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里面增加openCV的lib就可以了。
此时,可以设一下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_EXPORT(OPLAYER_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下面的第一个文件夹中存有相关崩溃信息。可以再次进行调试。
15、MVC框架传Model要从外往里传,很少平级之间传送,所以用SetModel()传。
Panel里面主要是布局,一般不涉及逻辑,对应的Controller肯定可以获取到对应的Panel,可以一般进行逻辑设计。Panel里的model一般是从对应的Controller传进的。
整明白model之间的传送顺序,才可以获取model
16、RelWithDebInfo下选择工程所在属性、选择C/C++优化,优化选项选择Disabled,可以看到更多调试信息
16、MVC框架中一般只有ViewController可以访问到自己的oplayer,oplayer与Panel之间是不通信的,并且使用较多的是Model
17、DxFTT2D3DMainController.cpp 中有很多SetModel,比较公用的model都是在此set的,是较多model的起点。
18、改变窗宽窗位实际改变的是lookuptable,将目标像素区域的灰度级颜色细化,其余不感兴趣的灰度值置成背景。
19、page 是包括panel与sidepanel的整页
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,如进行两次删除会报错。
24、view与对应的oplayer的关系为:view相对比较底层,依赖的库较少,Oplayer依赖的库较多。
25、模板类不能导出
26、LNK2005 是重定义问题,我遇到的解决方案,将一个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申请的对象或者内存的。
一般的正确做法是:
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位,当然像vtk、itk等库是没有32与64之分的。
35、
Q_OBJECT宏的作用:
只有加入了Q_OBJECT,你才能使用QT中的signal和slot机制。
不加而直接使用有可能出现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头文件。
目中使用第三方库一般需要用到dll、lib与.h文件
上一篇: 从微软官网下载VS离线包
下一篇: 建站常用13种PHP开源CMS比较
推荐阅读
-
Java集合排序及java集合类详解 博客分类: Java 基础笔记 java
-
Hashtable和HashMap的区别 博客分类: Java 基础笔记 java
-
Java集合排序及java集合类详解 博客分类: Java 基础笔记 java
-
JAVA数据结构 博客分类: Java 基础笔记 java基础
-
Android微信第三方登录(个人笔记)
-
关于MYSQL中每个用户取1条记录的三种写法(group by xxx)
-
StringBuffer VS StringBuilder 博客分类: Java thread
-
浅拷贝和深拷贝深入理解(shallow copy VS deep copy)
-
Python学习笔记之解析json的方法分析
-
javascript学习笔记——事件流、事件处理程序、事件对象、事件类型、内存和性能