Code::Blocks使用释疑

来源:互联网 发布:ccf工资计算java 编辑:程序博客网 时间:2024/05/13 01:03

Code::Blocks有着强大的编辑特性和开放的编译器接口,是免费的C++IDE的不二选择。但在使用过程中也会给初学者带来不少疑惑,下面我就自己遇到的一些情况逐一说明,希望能帮助不少初窥Code::Blocks门径的人,少走弯路。

 

一:编译器选择。

1.       Code::Blocks + GUN GCC(MinGW)。这是Code::Blocks的默认编译器,强烈推荐使用,除了编译选项以及报错信息和VC不一致以外,其他没有什么区别。MinGW库对windows的支持也很到位,debug很自然的集合在IDE中。而且,不需要额外的下载和设置。

2.       Code::Blocks + VC2003 ToolKit。乍看上去很不错,我也是用此组合尝试着编译了一下WinXP SDK,编译没有问题,但他不能进行DebugVC2003 ToolKt不包含Debug工具,网上有文章介绍使用Debug tools for Windows(X86),他是一个独立的Debug工具,不能和Code::BlocksIDE整合。因此,他是一个诱人的馅饼,当然,如果你不介意使用Debug tools for Windows(X86)作为Debug工具的话,也可以使用。建议高手使用,初学者不要浪费时间在此组合中。

3.       Code::Blocks + VC2005 express edition。在我眼里,这是一个陷阱。原因不在于Code::Blocks,而在于VC2005 Express本身像一个玩具,居然缺少基本的STL库,充分体现了微软的小气,缺少实用价值。当然你可以使用另外的STL库来扩充。本身来说,Code::BlocksVC2005 express edition就有一点重复,都注重编辑性能,不注重库问题。不建议使用,不值得你去浪费时间,还不如你直接使用VC2005 express

 

二:编译器选项和环境设置

   C++编译一定要注意两个问题,路径设置、编译器选项设置,否则会出现意想不到的错误。Code::Block有三层编译设置,一层是全局的设置,适用于所有的项目,第二层是项目的设置。第三层是项目中不同编译目标的选项设置,如DebugRelease设置。

1.       全局的设置(第一层):选择菜单“Settings”----“Compiler and Debuger settings”.

 

如上图,根据编译器选择的不同,我们需要设置不同的路径,编译工具、编译器设置。

Search Directory:(Compiler Tab页)用来设置全局的Include路径。

               Linker Tab 页)用来设置全局Lib库的路径

                (Resource compiler Tab )用来设置资源编译器的搜索路径。

ToolChain :依据不同的编译器选择编译和Debug工具。

Compiler settings:不同编译器的编译开关。

LinkerSettings:用来添加附加库和附件连接参数。

  当你使用不同的编译器时,上面的设置就要更具编译器的特性做适当的设置。

 

2.       项目的设置(第二层和第三层):选择菜单”Project”----“Build options”.

 

如上图,通过Project build options可以设置第二层和第三层编译参数。在左面的树形目录的顶部是项目名称,选择它可以设置整个项目的编译选项(第二层设置),在下面是项目的不同编译目标的编译选项(第三层)。不同的编译目标可以在菜单”project”---“properties”中的“build target”页面进行添加或管理。

第二层和第三层和设置和全局的编译选项相似:

Search Directory:(Compiler Tab页)用来设置项目的Include路径。

               Linker Tab 页)用来设置项目Lib库的路径

                (Resource compiler Tab )用来设置资源编译器的搜索路径。

Compiler settings:(CompilerFlags 页面)不同编译器的编译开关。

               Other Options 页面)其他的编译参数。可参阅GCC帮助。

               #define 页面) 自定义的参数。例如你可以加入_UNICODE以支持宽字符

 

LinkerSettings:用来添加附加库和附件连接参数。

 

当准确的设置好这些参数你就可以开始编译程序了!

 

三:常见问题

 

1.       无法在IDE中进行调试。

Code::Blocks默认设置并不是调试环境,也就是说,在Compiler选项中没有设置调试Flag。解决方法是在第二层或第三层编译器设置中在Compiler Flags页面中将”produce debugging symbols [-g]”选中。或者直接在#define页面中写入自定义参数_DEBUG

当然推荐使用的方法是在第三层设置中建立DebugRelease两种不同的编译目标。

 

2.       error LNK2001: unresolved external symbol

这是最常见的链接错误,是用户在编译时使用了正确的头文件,但是在引用库文件时却没有设置正确的库。解决方法是在菜单“Object---Build Option”中的Link setting页面中添加合适的库引用。

在使用VC2003 Tool kit时也会因为Compiler Flags设置不对而出现此条出错信息。由于VC2003 Tool Kit没有提供可调试库,所以当你在Compiler Flags页面中设置使用了调试库,就会出现找不到调试函数链接的问题。引起问题的相关Compiler Flags设置如下:

Single-threaded debug Runtime library[/MLd]

Mult-threaded Debug Runtime library [/MTd]

Mult-threaded DLL Debug Runtime library [/MDd]

解决方法是将他们都设置程非Debug的相关选项。如下:

Single-threaded Runtime library[/ML]

Mult-threaded Runtime library [/MT]

Mult-threaded DLL Runtime library [/MD]

 

3.       error LNK2019: unresolved external symbol

这条错误信息基本和error LNK2001相似,具体有什么区别,我还没有搞很清楚。

 

4.       Code::Blocks中使用中文的问题

在使用中文后,编译时遇到Illegal byte sequence错误,网上找到的解决办法:

    Setting->Compiler and debug Options->Compiler Setting页面->Other页面,加入

-finput-charset=GBK

这种方法在简单情况下可用,但在编译多语言项目和复杂项目时错误百出,不足采用。解决方法是在第二层编译选项中设置Object->Build Options->Compiler settings->#define中加入UNICODE_UNICODE参数,使项目使用UNICODE编码。这种方法的代价是你在定义字符串时必须使用宏TEXT_L。而所有的函数都将使用宽字符版本。

 

5.       CodeBlocks/MinGW/lib/libmingw32.a(main.o):main.c|| undefined reference to `WinMain@16'

此错误出现在链接完成的最后阶段,是链接程序找不到程序的window入口点。引起此原因的的主要问题是MinGW好像只认识WinMain入口点,不认识高版本的_t WinMain入口点。_tWinMain 是基本函数。根据编译标志 _MBCS _UNICODE生成 int WinMain() int wWinMain()。但在MinGW编译器下,解决方法很简单,就是将_tWinMain改为WinMain()。即使使用_UNICODE标志也只用采用int WinMain()作为程序入口点,而且这样的设置程序运行正常!!

 

6.       error: 'RBHITTESTINFO' has not been declared

当我们编译WinXPSDK项目时,由于没有设置项目的平台版本和IE版本参数,致使许多扩展的控件和数据结构不可用。解决办法是在编译器设置中的“#define 页面写入平台版本参数。如_WIN32_IE=0x0500.

关于windows版本控制参数如下表所示:

Minimum system required                 Macros to define

Windows Server 2008                      _WIN32_WINNT>=0x0600

                                                         WINVER>=0x0600

 

Windows Vista                            _WIN32_WINNT>=0x0600

                                                     WINVER>=0x0600

 

Windows Server 2003                      _WIN32_WINNT>=0x0502

                                                          WINVER>=0x0502

 

Windows XP                               _WIN32_WINNT>=0x0501

                                                       WINVER>=0x0501

 

Windows 2000                             _WIN32_WINNT>=0x0500

                                                      WINVER>=0x0500

 

Windows NT 4.0                           _WIN32_WINNT>=0x0400

                                                       WINVER>=0x0400

 

Windows Me                               _WIN32_WINDOWS=0x0500

                                                       WINVER>=0x0500

 

Windows 98                               _WIN32_WINDOWS>=0x0410

                                                   WINVER>=0x0410

 

Windows 95                               _WIN32_WINDOWS>=0x0400

                                                    WINVER>=0x0400

 

Internet Explorer 7.0                        _WIN32_IE>=0x0700

Internet Explorer 6.0 SP2                 _WIN32_IE>=0x0603

Internet Explorer 6.0 SP1                 _WIN32_IE>=0x0601

Internet Explorer 6.0                        _WIN32_IE>=0x0600

Internet Explorer 5.5                         _WIN32_IE>=0x0550

Internet Explorer 5.01                        _WIN32_IE>=0x0501

Internet Explorer 5.0, 5.0a, 5.0b          _WIN32_IE>=0x0500

Internet Explorer 4.01                       _WIN32_IE>=0x0401

Internet Explorer 4.0                          _WIN32_IE>=0x0400

Internet Explorer 3.0, 3.01, 3.02        _WIN32_IE>=0x0300

 

 三:建立U盘编译环境

     对于经常在不同机器上进行编程的人员,需要频繁的设置两个不同的编译环境和文件,还会出现不同步的现象。Code::Blocks可以简单的变为绿色版,将它直接拷贝到U盘,就可以制作一个口袋版的C++IDE,随时可以进行编程。具体做法如下:

      将Code::Blocks安装后的目录拷贝到U盘中,然后将C:/Documents and Settings/Default user/Application Data/codeblocks/目录中的default.conf文件也拷贝到U盘CodeBlocks目录下即可。目录中的Default user依据不同的计算机登陆设置会有不同,需要自己确定。

 

四:库选择

使用C++当然要选择好库了,个人喜好轻量级的Win32xx库,有完全的源代码,而且完全支持GCC编译器。如果考虑到移植等问题,那就使用wxWidget。着看个人爱好了。

 

好了,仅依据自己的经验分享给大家,希望高手补充!

 

2011-5-17