• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 319, comments - 22, trackbacks - 0, articles - 11
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            本文介紹的是 Qt 選擇性編譯和庫裁減,幫你節約時間的一篇文章,先來看內容。

            AD:

            Qt 選擇性編譯裁減是本文將要介紹的內容,編譯一次Qt要耗費太多的時間,常常是越著急用它,編起來越慢。其實通過很簡單的幾招可以幫你節省編譯的時間。下面就一一道來:

            編譯之前確定哪些功能是不必要的,對編譯樹進行簡單裁剪

            比如最常見的,像demos, examples,雖然很有參考價值,但完全可以放在后面用到的時候再單獨編譯小工程,這樣可以節省不少時間。經過實踐,最簡單的方法是修改configure文件,在該文件中有個指定編譯目錄的字段:

            1. QT_DEFAULT_BUILD_PARTS=”libs tools examples demos docs translations” 

            可以把examples、demos和docs從這里去掉,但要注意,別的可不能隨便去掉。

            如果在后面的使用中發現有些小工程需要編譯了,可以采用一般編譯Qt程序的方法,即用Qt安裝目錄bin下的qmake來生成Makefile,同樣可以編譯和測試例子代碼,一點也不影響使用。

            裁剪Qt模塊

            Qt從4版本開始采用了模塊化的形式,將獨立的功能封裝在獨立的里,所以可以很簡單的去掉一些不需要的,這樣也能節省編譯時間和對硬盤空間的占用。 Qt的configure配置提供了一些設置模塊的方法,如它支持-no-svg和-no-webkit,通過configure的時候加這些選項就可以去掉這部分支持。相應的還有很多小的功能可以通過configure參數的形式配置,具體的參考configure –help的輸出。在查看configure幫助的時候特別要注意加*號的內容,也就是Qt默認的configure選項,有的時候默認選項可不一定是討人喜歡的哦。

            Qt桌面版本默認會盡量多的編譯feature進去,這樣有一定的好處,就是用戶可以用到所有的Qt功能,但壞處也很明顯,那就是編譯出來的Qt超級大,特別是編譯debug版本,基本上要占1到2G的空間,所以個人感覺研究一下configure的選項還是很有必要的。另外, 默認狀況下有些插件是不會編譯的,比如數據庫插件,往往需要用戶自己根據需要編譯,這一點也要注意。

            針對嵌入式版本的配置

            Qt的嵌入式版本本身就支持feature裁剪,我們可以充分利用這一特性讓Qt庫盡量變小。具體的做法是要做一個自己的qconfig-[myconfig].h特性文件,該文件中定義你要去掉Qt中的哪些feature。在configure的時候加“-qconfig myconfig” 選項, Qt就會根據你給出的配置文件來編譯,以達到裁剪的目的。這里要強調一下,這種裁剪方式只適用于嵌入式版本。這里的myconfig可以用任何你喜歡的名字來代替。
            在qt的代碼中已經給出了一些qconfig頭文件的例子,默認編譯采用full config也就是

            不裁剪任何feature。所有Qt預定義好的qconfig文件,可以在src/corelib/global/下找到,包括qconfig-minimal.h, qconfig-small.h, qconfig.medium.h,qconfig-large.h和qconfig-dist.h,也就是從裁剪量由多到少都有據可依。如果要添加你自己的配置文件,要在src/corelib/global下建立一個形如qconfig-xxx.h的文件,這個xxx也就是你要在configure的時候傳入的qconfig參數。筆者測試使用的Qt版本是4.4.1,這個版本的build system有個小毛病,就是如果你指定的qconfig參數實際上沒有qconfig-xxx.h文件對應, build不會停止,它只會給出一個不起眼的提示,編譯過程會繼續, 這一點挺讓人費解的。而且這種情況下Qt編譯使用的配置基本上和fullconfig相同,鑒于它的讓人迷惑的舉動,個人覺得有必要提醒大家一下,使用自定義qconfig的時候一定要確定配置文件放對了位置,而且qconfig參數給的正確。

            一般我們的建議是在桌面上測試階段編譯一個full的版本,再根據你的項目使用Qt feature的情況總結哪些可去掉的feature。 feature之間有千絲萬縷的依賴關系,這個問題也是困擾很多人的難點所在。具體的依賴可以查閱src/corelib/global/qfeatures.h和src/corelib/global/qfeatures.txt(描述依賴關系的文檔)。另外,Qt里還提供了一個可視化的配置依賴的工具,叫做qconfig,在QTDIR/tools/qconfig目錄。該工具需要基于Qt桌面版本編譯。如在我的linux系統下可以用下面的命令來編譯:

            1. $ cd qt-embedded-linux-commercial-4.4.1/tools/qconfig  
            2. $ /usr/local/Trolltech/Qt-4.4.3/bin/qmake  
            3. $ make 

            編譯成功后運行./qconfig,初始要打開qfeatures.txt. Qconfig讀取該文件生成一個樹狀圖,該圖很清楚的顯示出feature之間的依賴關系。如下圖所示,如果你去掉了LINEEDIT這個feature,用到該控件的combobox也就不能繼續使用了。有了這個工具裁剪Qt變得簡潔直觀,方便了很多。

            選定了你要去掉的feature后點擊菜單File->Save As..會彈出保存文件的頁面,文件名字應該定義成qconfig-xxx.h的形式,這樣你在configure的時候就可以傳入相應的qconfig參數了。你還可以通過選擇File->Open打開現有的qconfig-xxx.h文件,通過修改已經有的文件更快的編輯配置。

            根據筆者測試,未經裁剪的qte4.4.1編譯出來為:

            1. libQtCore.so是2.6M  
            2. libQtGui.so是9.5M 

            如果用small來編譯,就能縮小為:

            1. libQtCore.so是2.0M  
            2. libQtGui.so是5.7M 

            差異還是比較明顯的。

            小結:Qt 選擇性編譯裁減的內容介紹完了,希望本文對你有所幫助。更多內容請參考編輯推薦。

            【編輯推薦】

            posted @ 2011-07-26 06:38 RTY 閱讀(575) | 評論 (0)編輯 收藏

            #include <QApplication>
            #include 
            <QLineEdit>
            #include 
            <qDebug>
            #include 
            <QTime>
            #include 
            <QTreeWidget>
            #include 
            <QStringList>
            #include 
            <QItemDelegate>
            #include 
            <QProgressBar>
            class ImageDelegate : public QItemDelegate
            {


            public:
                ImageDelegate(QObject 
            *parent = 0):QItemDelegate(parent){};
                QWidget 
            *createEditor(QWidget *parent, const QStyleOptionViewItem &option,
                            
            const QModelIndex &index) const
                {
                            QProgressBar 
            *progress = new QProgressBar(parent);
                            progress
            ->setValue(20);
                            
            return progress;
                 };
            };
            int main(int argc, char *argv[])
            {
                QApplication a(argc, argv);
                    QTreeWidget tree;
                    tree.setColumnCount(
            2);
                    tree.setHeaderLabels(QStringList() 
            << "colum");
                    tree.setItemDelegate(
            new ImageDelegate(&tree));
                    QTreeWidgetItem 
            *item1 = new QTreeWidgetItem(&tree);
                    item1
            ->setIcon(0, QIcon("E:\\Audio_MIME.ico"));
                    tree.openPersistentEditor(item1);
                    QTreeWidgetItem 
            *item2 = new QTreeWidgetItem(&tree);
                    item2
            ->setText(0"aaaa");
                    tree.show();
                
            return a.exec();
            }

            posted @ 2011-07-25 22:04 RTY 閱讀(1354) | 評論 (0)編輯 收藏

            a.bat

            BatchFile code
            @echo off call b.bat VarReturn echo 批處理b.bat的返回值是:%VarReturn%


            b.bat

            BatchFile code
            @echo off set /a sum=1+2 set %1=%sum%

            posted @ 2011-07-21 21:51 RTY 閱讀(760) | 評論 (0)編輯 收藏



                從Linux內核2.6開始,Linux內核的編譯采用Kbuild系統,這同過去的編譯系統有很大的不同,尤其對于Linux內核模塊的編譯。在新的系統下,Linux編譯系統會兩次掃描Linux的Makefile:首先編譯系統會讀取Linux內核頂層的Makefile,然后根據讀到的內容第二次讀取Kbuild的Makefile來編譯Linux內核。
            Linux內核Makefile分類
            ·         Kernel Makefile 
            Kernel Makefile位于Linux內核源代碼的頂層目錄,也叫 Top Makefile。它主要用于指定編譯Linux Kernel目標文件(vmlinux)和模塊(module)。這編譯內核或模塊是,這個文件會被首先讀取,并根據讀到的內容配置編譯環境變量。對于內核或驅動開發人員來說,這個文件幾乎不用任何修改。
            ·         Kbuild Makefile 
            Kbuild系統使用Kbuild Makefile來編譯內核或模塊。當Kernel Makefile被解析完成后,Kbuild會讀取相關的Kbuild Makefile進行內核或模塊的編譯。Kbuild Makefile有特定的語法指定哪些編譯進內核中、哪些編譯為模塊、及對應的源文件是什么等。內核及驅動開發人員需要編寫這個Kbuild Makefile文件。
            ·         ARCH Makefile 
            ARCH Makefile位于ARCH/$(ARCH)/Makefile,是系統對應平臺的Makefile。Kernel Top Makefile會包含這個文件來指定平臺相關信息。只有平臺開發人員會關心這個文件。
            Kbuild Makefile
                Kbuild Makefile的文件名不一定是Makefile,盡管推薦使用Makefile這個名字。大多的Kbuild文件的名字都是Makefile。為了與其他Makefile文件相區別,你也可以指定Kbuild Makefile的名字為Kbuild。而且如果“Makefile”和“Kbuild”文件同時存在,則Kbuild系統會使用“Kbuild”文件。
            ·         目標定義 
            Kbuild Makefile的一個最主要功能就是指定編譯什么,這個功能是通過下面兩個對象指定的obj-?和xxx-objs:
            ·         obj-?
            obj-?指定編譯什么,怎么編譯?其中的“?”可能是“y”或“m”,“y”指定把對象編譯進內核中,“m”指定把對象編譯為模塊。語法如下;
                obj-? = $(target).o
            target為編譯對象的名字。如果沒有指定xxx-objs,這編譯這個對象需要的源文件就是$(target).c或$(target).s。如果指定了$(target)-objs,則編譯這個對象需要的源文件由$(target)-objs指定,并且不能有$(target).c或$(target).s文件。
            ·         xxx-objs 
            xxx-objs指定了編譯對象需要的文件,一般只有在源文件是多個時才需要它。
            只要包含了這兩行,Kbuild Makefile就應該可以工作了。
            ·         嵌套編譯 
            有時一個對象可能嵌入到另一個對象的目錄下,那個如何編譯子目錄下的對象呢?其實很簡單,只要指定obj_?的對象為子目錄的名字就可以了:
            obj-? = $(sub_target)/
            其中“?”可以是“y”或“m”,$(sub_target)是子目錄名字。
            ·         編譯器選項 
            盡管在大多數情況下不需要指定編譯器選項,有時我們還是需要指定一些編譯選項的。
            ·         ccflags-y, asflags-y and ldflags-y 
            這些編譯選項用于指定cc、as和ld的編譯選項
            編譯外部模塊
            有時候我們需要在內核源代碼數的外面編譯內核模塊,編譯的基本命令是:
                make -C $(KERNEL_DIR) M=`pwd` modules
            我們可以把這個命令集成到Makefile里,這樣我們就可以只輸入“make”命令就可以了?;叵肷弦徽碌哪莻€Makefile,它把Normal Makefile 和Kbuild  Makefile集成到一個文件中了。為了區別Kbuild Makefile 和Normal Makefile,這樣我們改寫Makefile為如下形式,并且添加Kbuild Makefile - “Kbuild”。
            ##Makefile
            ifneq ($(KERNELRELEASE),)
            include "Kbuild"
            else
            KERNEL_DIR = /lib/modules/`uname -r`/build
            MODULEDIR := $(shell pwd)
            .PHONY: modules
            default: modules
            modules:
                    make -C $(KERNEL_DIR)  M=$(MODULEDIR) modules
            clean distclean:
                    rm -f *.o *.mod.c .*.*.cmd *.ko
                    rm -rf .tmp_versions
            endif

            ## Kbuild
            MODULE_NAME = helloworld
            $(MODULE_NAME)-objs := hello.o
            obj-m   := $(MODULE_NAME).o
            一般不需要在Makefile里包含如下代碼,這樣寫完全是為了兼容老版本的Kbuild系統。KERNELRELEASE變量在Kernel Makefile里定義的,因此只有在第二次由Kbuild讀取這個Makefile文件時才會解析到Kbuild的內容。 
            ifneq ($(KERNELRELEASE),)
            include "Kbuild"
            else
            ...
            endif
            外部頭文件
            有時需要連接內核源代碼外部的系統頭文件,但Kbuild系統默認的系統頭文件都在內核源代碼內部,如何使用外部的頭文件呢?這個可以借助于Kbuild系統的特殊規則:
            ·         EXTRA_CFLAGS 
            EXTRA_CFLAGS可以給Kbuild系統添加外部系統頭文件,
                EXTRA_CFLAGS += $(ext_include_path)
            一般外部頭文件可能位于外部模塊源文件的目錄內,如何指定呢?這可以借助$(src)或$(obj)
            ·         $(src)/$(obj) 
            $(src)是一個相對路徑,它就是Makefile/Kbuild文件所在的路徑。同樣$(obj)就是編譯目標保存的路徑,默認就是源代碼所在路徑。
            因此,我們修改Kbuild文件添加 EXTRA_CFLAGS 來包含外部頭文件盡管在這個驅動里沒有引用外部系統頭文件:
            ## Kbuild
            MODULE_NAME = helloworld
            $(MODULE_NAME)-objs := hello.o
            EXTRA_CFLAGS := -I$(src)/include
            obj-m   := $(MODULE_NAME).o



            ·         Goal definitions
            Example:
               obj-y += foo.o
            告訴kbuild,在文件夾中又一個叫做foo.o的object。foo.o將會被從foo.c或者foo.S被構建。

            如果foo.o被構建成一個模塊,則將使用變量obj-mExample:
               obj-$(CONFIG_FOO) += foo.o
            $(CONFIG_FOO)要么是y(built-in)要么是m(module)。如果CONFIG_FOO既不是y也不是m,那么文件將不會被編譯也不會被連接。
            ·         Built-in object goals - obj-y
            kbuild Makefiles在$(obj-y)列表中為vmlinux指明object文件。這個列表依靠內核的配置。
            $(obj-y)中的文件的順序是非常重要的。列表中允許兩個相同的文件:第一個實體將被連接到built-in.o,后面的實體將會被忽略。
            連接的順序也很重要,因為在boot過程中某些函數(module_init()/_initcall)將會按順序出現。因此,如果改變了連接順序,將會改變你的SCSI控制器的檢測順序,你的磁盤也同時被重新編號了。
            Example:
              #drivers/isdn/i4l/Makefile
              # Makefile for the kernel ISDN subsystem and device drivers.
              # Each configuration option enables a list of files.
              obj-$(CONFIG_ISDN)             += isdn.o
              obj-$(CONFIG_ISDN_PPP_BSDCOMP) += isdn_bsdcomp.o
            ·         Loadable module goals - obj-m
            $(obj-m)指明object文件作為可裝載的內核模塊被構建。一個模塊可能從一個或者多個源文件被構建。kbuild maefile只是簡單的將源文件加到%(obj-m)
            Example:
              #drivers/isdn/i4l/Makefile
              obj-$(CONFIG_ISDN_PPP_BSDCOMP) += isdn_bsdcomp.o
            注意這里$(CONFIG_ISDN_PPP_BSDCOMP)是m.
            Note: In this example $(CONFIG_ISDN_PPP_BSDCOMP) evaluates to 'm'。
            如果一個內核模塊從多個源文件構建,KBuild就必須要知道你想從哪些部分構建模塊。因此,你不得不設置$(-objs)變量來告訴KBuild。
            Example:
              #drivers/isdn/i4l/Makefile
              obj-$(CONFIG_ISDN) += isdn.o
              isdn-objs := isdn_net_lib.o isdn_v110.o isdn_common.o
            在這個例子中,模塊名是isdn.o,Kbuild將會編譯列在$(isdn-objs)object文件,然后在這些文件的列表中調用"$(LD) -r"來產生isdn.o。
            Kbuild使用后綴-objs,-y來識別混合的object文件。這允許Makefiles使用變量CONFIG_sambol來決定一個object是否是混合object的的一部分。
            Example:
              #fs/ext2/Makefile
                     obj-$(CONFIG_EXT2_FS)        += ext2.o
               ext2-y                       := balloc.o bitmap.o
                     ext2-$(CONFIG_EXT2_FS_XATTR) += xattr.o

            在這個例子中,如果$(CONFIG_EXT2_FS_XATTR)是y,則xattr.o只是混合object文件ext2.o的一部分。
            注意,當你構造一個objects到內核中時,上面的語法當然也能夠工作。因此,如果你讓CONFIG_EXT2=Y,KBuild將會為你構建一個獨立的ext2.o文件,并且連接到built-in.o。
            ·         Library file goals - lib-y
            obj-*連接的Objects在指明的文件夾中被用作模塊或者綜合進built-in.o。也又可能被列出的objects將會被包含進一個庫,lib.a。所有用lib-y列出的objects在那個文件夾中被綜合進單獨的一個庫。列在obj-y和附加列在lib-y中的Objects將不會被包含在庫中,因為他們將會被任意的存取。對于被連接在lib-m中,連續的objects將會被包含在lib.a中。值得注意的是kbuild makefile可能列出文件用作built-in,并且作為庫的一部分。因此,同一個文件夾可能包含一個built-in.o和lib.a文件。
            Example:
              #arch/i386/lib/Makefile
              lib-y    := checksum.o delay.o
            這里講會創建一個基于checksum.o和delay.o的庫文件。對于kbuild,識別一個lib.a正在被構建,這個文件夾應該被列在libs-y中。lib-y的使用方法通常被限制在lib/和arc/*/lib中。
            ·         Descending down in directories
            一個Makefile只負責在他自己的文件夾中構建objects。 在子文件夾中的文件應該由子文件夾中的Makefiles來照顧。如果你知道他們,build系統將會自動遞歸地用在子文件夾中的make。
            在這種情況下obj-yobj-m就被使用了。ext2存在于不同的文件夾中,Makefile出現在fs/,則告訴kbuild從后面的參數下來。
            Example:
              #fs/Makefile
              obj-$(CONFIG_EXT2_FS) += ext2/
            如果CONFIG_EXT2_FS被設置成y(built-in)或者m(modular),相應的obj-變量將會被設置,并且kbuild將會從ext2文件夾繼承下來。Kbuild只會使用這些信息來決定它需要訪問這些文件夾,而在子文件夾中的Makefile來指明哪些是modules哪些是built-in。
            當賦值文件夾名字的時候,使用CONFIG_variable是很好的選擇。這允許kbuild完全的跳過文件夾,而不管CONFIG_option是否是y或者m。
            ·         Compilation flags
                EXTRA_CFLAGS, EXTRA_AFLAGS, EXTRA_LDFLAGS, EXTRA_ARFLAGS。
            所有的EXTRA_ variables只應用在kbuild中,他們被賦值的地方。EXTRA_variables應用在kbuild makefile中所有的可執行的命令。$(EXTRA_CFLAGS) 指明用$(CC)編譯C文件的時候的選項。
            Example:
              # drivers/sound/emu10k1/Makefile
              EXTRA_CFLAGS += -I$(obj)
              ifdef DEBUG
                  EXTRA_CFLAGS += -DEMU10K1_DEBUG
              endif
            這里的變量是必須的,因為頂層的Makefile擁有變量$(CFLAGS)并且用它來作為整個樹的編譯標志當編譯匯編源文件的時候$(EXTRA_AFLAGS),和每個文件夾的選項是相似的。
            Example:
              #arch/x86_64/kernel/Makefile
              EXTRA_AFLAGS := -traditional
            $(EXTRA_LDFLAGS)$(EXTRA_ARFLAGS) 對于每個文件夾的$(LD)和$(AR)選項是類似的。
            Example:
              #arch/m68k/fpsp040/Makefile
              EXTRA_LDFLAGS := -x
            CFLAGS_$@, AFLAGS_$@
            CFLAGS_$@AFLAGS_$@只應用到當前kbuild makefile的命令。
            $(CFLAGS_$@) 為每個文件的$(CC)指明選項。$@
            部分有一個字面上的值,指明它是為那個文件。
            Example:
              # drivers/scsi/Makefile
              CFLAGS_aha152x.o =   -DAHA152X_STAT -DAUTOCONF
              CFLAGS_gdth.o    = # -DDEBUG_GDTH=2 -D__SERIAL__ -D__COM2__ \
                     -DGDTH_STATISTICS
              CFLAGS_seagate.o =   -DARBITRATE -DPARITY -DSEAGATE_USE_ASM
            These three lines specify compilation flags for aha152x.o,
            gdth.o, and seagate.o
            $(AFLAGS_$@) is a similar feature for source files in assembly
            languages.
            Example:
              # arch/arm/kernel/Makefile
              AFLAGS_head-armv.o := -DTEXTADDR=$(TEXTADDR) -traditional
              AFLAGS_head-armo.o := -DTEXTADDR=$(TEXTADDR) -traditional

            posted @ 2011-07-21 07:24 RTY 閱讀(1340) | 評論 (0)編輯 收藏

                 摘要: QT通過三種形式提供了對線程的支持。它們分別是,一、平臺無關的線程類,二、線程安全的事件投遞,三、跨線程的信號-槽連接。這使得開發輕巧的多線程Qt程序更為容易,并能充分利用多處理器機器的優勢。多線程編程也是一個有用的模式,它用于解決執行較長時間的操作而不至于用戶界面失去響應。在Qt的早期版本中,在構建庫時有不選擇線程支持的選項,從4.0開始,線程總是有效的。線程類Qt 包含下面一些線程相...  閱讀全文

            posted @ 2011-07-20 07:04 RTY 閱讀(4331) | 評論 (0)編輯 收藏

                 摘要: Linux on Power 上的調試工具和技術Calvin Sze (calvins@us.ibm.com), Linux 顧問 , EMC簡介: 調試是一項主要的軟件開發活動,作為應用程序開發人員,您無法避免對程序進行調試。有效的調試不僅能縮短軟件開發周期,而且可以節省成本。本文簡要介紹了在用戶空間的 C/C++ 和 Java? 應用程序中查找 bug 的技術,并介紹了一些...  閱讀全文

            posted @ 2011-07-19 07:30 RTY 閱讀(1633) | 評論 (0)編輯 收藏

                 摘要: 概要:GUI (圖形用戶界面graphical user interface)工具自詡其擁有許多的功能。把GUI測試自動化作為一個編程的項目處理,你將需要一個和你項目大小相當的工具。這是一篇對你購買的GUI測試自動化產品中你所需的關鍵功能的梗概。·         在選擇一個GUI測試工具需要考慮的...  閱讀全文

            posted @ 2011-07-19 06:36 RTY 閱讀(1135) | 評論 (0)編輯 收藏

            1、如何在Release狀態下進行調試

            Project->Setting=>ProjectSetting對話框,選擇Release狀態。C/C++標簽中的Category選General,Optimizations選Disable(Debug),Debut info選Program Database。在Link標簽中選中Generate debug info復選框。

            注:只是一個介乎Debug和Release的中間狀態,所有的ASSERT、VERIFY都不起作用,函數調用方式已經是真正的調用,而不查表,但是這種狀態下QuickWatch、調用隊列跟蹤功能仍然有效,和Debug版一樣。

            2、Release和Debug有什么不同

            Release版稱為發行版,Debug版稱為調試版。

            Debug中可以單步執行、跟蹤等功能,但生成的可執行文件比較大,代碼運行速度較慢。Release版運行速度較快,可執行文件較小,但在其編譯條件下無法執行調試功能。

            Release的exe文件鏈接的是標準的MFC DLL(Use MFC in a shared or static dll)。這些DLL在安裝Windows的時候,已經配置,所以這些程序能夠在沒有安裝Visual C++ 6.0的機器上運行。而Debug版本的exe鏈接了調試版本的MFC DLL文件,在沒有安裝Visual C++6.0的機器上不能運行,因為缺相應的DLL,除非選擇use static dll when link。

            3、ASSERT和VERIFY有什么區別

            ASSERT里面的內容在Release版本中不編譯,VERIFY里面的內容仍然翻譯,但不再判斷真假。所以后者更安全一點。例如ASSERT(file.Open(strFileName))。

            一旦到了Release版本中,這一行就忽略了,file根本就不Open()了,而且沒有任何出錯的信息。如果用VERIFY()就不會有這個問題。

            4、Workspace和Project之間是什么樣的關系

            每個Workspace可以包括幾個project,但只有一個處于Active狀態,各個project之間可以有依賴關系,在project的Setting..中可以設定,比如那個Active狀態的project可以依賴于其他的提供其函數調用的靜態庫。

            5、如何在非MFC程序中使用ClassWizard

            在工程目錄下新建一個空的.RC文件,然后加入到工程中就可以了。

            6、如何設置斷點

            按F9在當前光標處增加一個斷點和取消一個斷點。

            另外,在編輯狀態下,按Ctrl+B組合鍵,彈出斷點設置對話框。然后單擊【Condition…】按鈕彈出設置斷點條件的對話框進行設置。

            7、在編輯狀態下發現成員變量或函數不能顯示提示是如何打開顯示功能

            這似乎是目前這個Visual C++ 6.0版本的一個bug,可按如下步驟使其正常,如再出現,可如法炮制:

            (1)關閉Project
            (2)刪除“工程名.ncb”文件
            (3)重新打開工程

            8、如何將一個通過ClassWizard生成的類徹底刪除

            首先在工作區的FileView中選中該類的.h和.cpp文件,按delete刪除,然后在文件管理器中將這兩個文件刪除,再運行ClassWizard,這時出現是否移走該類的提示,選擇remove就可以了。

            9、如何將在workspace中消失的類找出來

            打開該類對應的頭文件,然后將其類名隨便改一下,這個時候工作區就會出現新的類,再將這個類改回原來的名字就可以了。

            10、如何清除所有的斷點

            菜單【Edit】->【Breakpoints…】,打開“Breakpoints”對話框,單擊【Remove All】按鈕即可??旖萱I是“Ctrl + Shift + F8”。

            11、如何再ClassWizard中選擇未列出的信息

            打開“ClassWizard”對話框,然后切換到“Class Info”頁面。改變“Message filter”,如選擇“Window”,“Message”頁面就會出現Window的信息。

            12、如何檢測程序中的括號是否匹配

            把光標移動到需要檢測的括號前面,按快捷鍵“Ctrl + ]”。如果括號匹配正確,光標就跳到匹配的括號處,否則光標不移動,并且機箱喇叭還會發出一聲警告。

            13、如何查看一個宏(或變量、函數)的定義

            把光標移動到要查看的一個宏上,就比如說最常見的DECLARE_MAP_MESSAGE上按一下F12(或右鍵菜單中的相關菜單),如果沒有建立瀏覽文件,就會出現提示對話框,按【確定】按鈕,然后就會跳到該宏(或變量、函數)定義的地方。

            14、如何添加Lib文件到當前工程

            單擊菜單【Project】->【Settings…】彈出“Project Setting”對話框,切換到“Link”標簽頁,在“Object/library modules”處輸入Lib文件名稱,不同的Lib之間用空格格開。

            15、如何快速刪除項目下的Debug文件夾中臨時文件

            在工作區的FileView視圖中選中對應的項目,單擊右鍵彈出菜單,選擇【Clean(selection only)】菜單即可。

            16、如何快速生成一個現有工程除了工程名外完全相同的新工程

            在新建工程的“New”對話框中選擇“Custom Appwizard”項,輸入新工程的名字,單擊【OK】按鈕。出現“Custom AppWizard”項,輸入新工程的名字,單擊【OK】按鈕。出現“Custom AppWizard-Step 1 of 2”對話框,選擇“An existing Project”項,單擊【Next】按鈕。出現“Custom AppWizard-Step 2 of 2”對話框,選擇現有工程的工程文件名,最后單擊【Finish】按鈕。編譯后就生成一個與現有工程相同但可以重新取名的工程AppWizard。

            現在就可以項用MFC AppWizard一樣用這個定制的向導。如果不想用了,可以在Visual C++ 6.0安裝目錄下CommonMSDev98Template目錄中刪除該Wizard對應的.awx和.pdb文件。

            17、如何解決Visual C++ 6.0不正確連接的問題

            情景:明明改動了一個文件,卻要把整個項目全部重新編譯鏈接一次。剛剛鏈接好,一運行,又提示重新編譯鏈接一次。

            這是因為出現了未來文件(修改時間和創建時間比系統時間晚)的緣故。可以這樣處理:找到工程文件夾下的debug目錄,將創建和修改時間都比系統時間的文件全部刪除,然后再從新“Rebuild All”一次。

            18、引起LNK2001的常見錯誤都有哪些

            遇到的LNK2001錯誤主要為:unresolved external symbol “symbol”。

            如果鏈接程序不能在所有的庫和目標文件內找到所引用的函數、變量或標簽,將產生此錯誤信息。

            一般來說,發生錯誤的原因有兩個:一是所引用的函數、變量不存在,拼寫不正確或者使用錯誤;其次可能使用了不同版本的鏈接庫。以下是可能產生LNK2001錯誤的原因:

            <1>由于編碼錯誤導致的LNK2001錯誤

            (1)不相匹配的程序代碼或模塊定義(.DEF)文件導致LNK2001。例如,如果在C++源文件了內聲明了一變量“var1”,卻試圖在另一個文件內以變量“var1”訪問改變量。
            (2)如果使用的內聯函數是在.cpp文件內定義的,而不是在頭文件內定義將導致LNK2001錯誤。
            (3)調用函數時如果所用的參數類型和頭函數聲明時的類型不符將會產生LNK2001錯誤。
            (4)試圖從基類的構造函數或析構函數中調用虛擬函數時將會導致LNK2001錯誤。
            (5)要注意函數和變量的可公用性,只有全局變量、函數是可公用的。靜態函數和靜態變量具有相同的使用范圍限制。當試圖從文件外部方位任何沒有在該文件內聲明的靜態變量時將導致編譯錯誤或LNK2001錯誤。

            <2>由于編譯和聯機的設置而造成的LNK2001錯誤

            (1)如果編譯時使用的是/NOD(/NODERAULTLIB)選項,程序所需要的運行庫和MFC時將得到又編譯器寫入目標文件模塊,但除非在文件中明確包含這些庫名,否則這些庫不會被鏈接進工程文件。這種情況下使用/NOD將導致LNK2001錯誤。
            (2)如果沒有為wWinMainCRTStartup設定程序入口,在使用Unicode和MFC時將出現“unresolved external on _WinMain@16”的LNK2001錯誤信息。
            (3)使用/MD選項編譯時,既然所有的運行庫都被保留在動態鏈接庫之內,源文件中對“func”的引用,在目標文件里即對“__imp__func”的引用。如果試圖使用靜態庫LIBC.LIB或LIBCMT.LIB進行鏈接,將在__imp__func上發生LNK2001錯誤。如果不使用/MD選項編譯,在使用MSVCxx.LIB鏈接時也會發生LNK2001錯誤。
            (4)使用/ML選項編譯時,如用LIBCMT.LIB鏈接會在_errno上發生LNK2001錯誤。
            (5)當編譯調試版的應用程序時,如果采用發行版模態庫進行鏈接也會產生LNK2001錯誤;同樣,使用調試版模態庫鏈接發行版應用程序時也會產生相同的錯誤。
            (6)不同版本的庫和編譯器的混合使用也能產生問題,因為新版的庫里可能包含早先的版本沒有的符號和說明。
            (7)在不同的模塊中使用內聯和非內聯的編譯選項能夠導致LNK2001錯誤。如果創建C++庫時打開了函數內聯(/Ob1或/Ob2),但是在描述該函數的相應頭文件里卻關閉了函數內聯(沒有inline關鍵字),只是將得到錯誤信息。為避免該問題的發生,應該在相應的頭文件中用inline關鍵字標志為內聯函數。
            (8)不正確的/SUBSYSTEM或ENTRY設置也能導致LNK2001錯誤。

            19、如何調試一個沒有源碼的exe文件調用的dll

            在Visual C++ 6.0中,進入“Project Setting”對話框然后選擇Debug標簽頁。通常Visual Studio默認“executable for debug session”為可執行文件名,但可以將他改成任何你想要的程序。甚至可以指定不同的工作目錄以及傳遞參數到你的程序。這個技術常用來調試Dlls、名字空間擴展、COM對象和其他從某些EXE以及從第三方的EXE中調用的plug-in程序。

            20、Visual C++ 6.0工程中的項目文件都表示什么

            .opt:工程關于開發環境的參數文件。如工具條位置等信息。
            .aps(AppStudio File)資源輔助文件,二進制格式,一般不用去管它。
            .clw:ClassWizard信息文件,實際上是INI文件格式,有興趣可以研究一下。有時候ClassWizard出了問題,手工修改CLW文件可以解決。如果此文件不存在的話,每次用ClassWizard的時候回提示是否重建。
            .dsp(DevelopStudio Project):項目文件,文本格式,不過不熟悉的不要手工修改。
            .dsw(DevelopStudio Workspace):是工作區文件,其他特點和.dsp差不多。
            .plg:是編譯信息文件,編譯時的error和warning信息文件(實際上是一個html文件),一般用處不大。在單擊菜單【Tool】->【Option】彈出的對話框里面有個選項可以控制這個文件的生成。
            .hpj(Help Project):是生成幫助文件的工程,用microsoft Help Compiler可以處理。
            .mdp(Microsoft DevStudio Project):是舊版本的項目文件,如果要打開此文件的話,會提示你是否轉換成新的.dsp格式。
            .bsc:是用于瀏覽項目信息的,如果用Source Brower的話就必須有這個文件。如果不用這個功能的話,可以在Project Options里面去掉Generate Browse Info File,這樣可以加快編譯速度。
            .map是執行文件的映象信息記錄文件,除非對系統底層,這個文件一般用不著。
            .pch(Pre-Compiled File):是與編譯文件,可以加快編譯速度,但是文件非常大。
            .pdb(Program Database):記錄了程序有關的一些數據和調試信息,在調試的時候可能有用。
            .exp:只有在編譯DLL的時候才會生成,記錄了DLL文件的一些信息,一般也沒有用。
            .ncb:無編譯瀏覽文件(no compile browser)。當自動完成功能出問題時可以刪除此文件。編譯工程后會自動生成。

            posted @ 2011-07-17 23:03 RTY 閱讀(262) | 評論 (0)編輯 收藏

            雙緩沖的原理可以這樣形象的理解:把電腦屏幕看作一塊黑板。首先我們在內存環境中建立一個“虛擬“的黑板,然后在這塊黑板上繪制復雜的圖形,等圖形全部繪制完畢的時候,再一次性的把內存中繪制好的圖形“拷貝”到另一塊黑板(屏幕)上。采取這種方法可以提高繪圖速度,極大的改善繪圖效果。

              例如在OnDraw()函數中可以如下所述實現雙緩沖,其主要步驟分為四步:

             CPen Pen;
             Pen.CreatePen(PS_INSIDEFRAME,1,#e1e100);
             CBrush Brush;
             Brush.CreateSolidBrush(#e1e100);
             CDC dcMem;
             CBitmap bm;
             CRect rc;
             GetClientRect(&rc);
             // Step 1:為屏幕DC創建兼容的內存DC :CreateCompatibleDC()
             dcMem.CreateCompatibleDC(pDC);
             // Step 2:創建位圖:CreateCompatibleBitmap()
             bm.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height());
             // Step 3:把位圖選入設備環境:SelectObject(),可以理解為選擇畫布
             dcMem.SelectObject(&bm); 
             dcMem.SelectObject(Pen);
             dcMem.SelectObject(Brush);
             dcMem.Ellipse(0,0,50,50);//畫橢圓
             // Step 4:把繪制好的圖形“拷貝“到屏幕上:BitBlt()
             pDC->BitBlt(0,0,rc.Width(),rc.Height(),&dcMem,0,0,SRCCOPY);
             dcMem.DeleteDC();
             bm.DeleteObject();

              這樣便實現了雙緩沖,通過這個方法可以防止在VC中畫圖時出現屏幕閃爍的情況。

            posted @ 2011-07-17 22:54 RTY 閱讀(215) | 評論 (0)編輯 收藏

                 摘要: 詳解QT 信號機制 (下篇)2011-07-05 18:40 佚名 互聯網 我要評論(1) 字號:T | T信號不是Unix中進程間通信的信號。這里的信號更多地與圖形界面的輸入輸出聯系在一起(當然也可以是不可見的操作)。先來看內容。AD:繼續 詳解QT 信號機制 (上篇) 的內容接續介紹,本節介紹的是詳解QT 信號機制 (下篇),以下是Q...  閱讀全文

            posted @ 2011-07-14 07:41 RTY 閱讀(346) | 評論 (0)編輯 收藏

            僅列出標題
            共31頁: First 12 13 14 15 16 17 18 19 20 Last 
            日韩精品无码久久久久久| 三级三级久久三级久久| 精品久久久久久亚洲| 国产成人精品久久一区二区三区av| 91精品国产高清久久久久久io | 久久久人妻精品无码一区| 欧洲国产伦久久久久久久| 色综合久久久久无码专区| 国产69精品久久久久99尤物| 99久久这里只精品国产免费| 久久国产热精品波多野结衣AV| 国产福利电影一区二区三区久久久久成人精品综合 | 久久久久久毛片免费播放| 香蕉久久夜色精品国产小说| 亚洲国产精品无码久久青草| 国产精品美女久久久m| 无码任你躁久久久久久老妇| 狠狠色丁香久久综合婷婷| 久久99热这里只有精品国产| 久久国产乱子精品免费女| 色妞色综合久久夜夜| 亚洲成av人片不卡无码久久 | 国内精品久久久人妻中文字幕| 亚洲欧美久久久久9999 | 国产99精品久久| 亚洲综合精品香蕉久久网| 久久综合九色综合欧美就去吻| 久久亚洲国产欧洲精品一| 久久综合给合久久狠狠狠97色 | 精品熟女少妇aⅴ免费久久| 日日躁夜夜躁狠狠久久AV| 色诱久久av| 中文精品99久久国产| 蜜臀久久99精品久久久久久| 情人伊人久久综合亚洲| 精品久久久久久无码中文字幕一区| 中文精品99久久国产| 久久亚洲日韩看片无码| 久久综合亚洲鲁鲁五月天| 亚洲精品乱码久久久久66| 影音先锋女人AV鲁色资源网久久|