libgc 加 .make 在 vc6 vs2008 中的編譯方法

libgc 加 .make 在 vc6 vs2008 中的編譯方法


開源代碼多數是用 .mak 編譯 win 平臺,網上的教程多是說明命令行的,但這樣在裝了多個版本 vs 的電腦上很容易混亂,要每次執行不同的 vcvars32.bat 其實這個批處理不過是設置 sdk 的路徑等等,例如 "D:\Program Files\Microsoft Visual Studio 9.0\VC\bin\NMAKE" /f "D:\gs_d\vctest\gc-7.0\gc.mak" CFG="gc - Win32 Release"
那個 cfg 標誌是用來指定編譯版本的,實現可看對應的 mak,如果沒有執行那個 bat 文件夾的話就可能報 "NMAKE : fatal error U1073: don't know how to make '"\sys\TYPES.H"'"

其實不過是缺少 include 路徑環境變量罷了,這些其實是可以由 vs 來完成的,vc6下比較簡單,打開 .mak 文件會自動轉存爲 dsw ,但 vs2008 不行.不過我發現好象不支持一樣,實際也是可以的,我發現一個取巧的方式:先用vc6生成 dsw 再用 vs2008 打開就行了. 我覺得vs2008 還不可以直接建立 .mak 工程的,不過怎麼做還不明白.

用 vs 編譯的最大好處是可以方便的在其中調試代碼 -- 你用命令行不行吧?

--------------------------------------------------

最新的 libgc 不支持 vc6 ,不過修改一下就行,主要就是有些類型 vc6 不支持,在 vs2008 中參考寫一個就行了,例如

typedef unsigned __int64    uintptr_t;//clq test
typedef unsigned long ULONG_PTR, *PULONG_PTR;

        //clq test//strcat_s(exePath, sizeof(exePath), "\\..");
        strncat(exePath, "\\..", sizeof(exePath));

--------------------------------------------------

使用c/c++中的垃圾收集庫——libgc

分類: Linux 667人閱讀 評論(0) 收藏 舉報

 

libgc是一個保守的內存垃圾清理器,它會週期性的掃描程序中的數據,並標記所有的當前在heap對象中正在被使用的內存,隨後釋放所有未被標記的的內存。
但是,libgc不會檢測使用libgc以外的allocator分配的內存空間,也不會對其進行自動的釋放。
使用libgc可以解決一下問題:
1、內存的泄露;2、未分配空間就釋放(premature frees); 3、內存的碎片。
但它不能解決內存被重寫造成的問題。

具體使用:
1、先到 http://www.hpl.hp.com/personal/Hans_Boehm/gc/網站下載軟件,包名字爲gc.tar.gz

1. ./configure --prefix=……
2. make
3. make install

2、把頭文件<~/gc/include/gc.h>放到方便的地方。
3、編譯時連接gc庫:方法1:動態鏈接 gcc memgc.c -lgc -ldl 使用libgc.so, libdl.so兩個庫
方法2:靜態鏈接 gcc memgc.c ~/gc/lib/libgc.a -lpthread 使用libpthread.so
注:靜態鏈接的好處是可以拷貝到類似的系統中用,而不需要在那臺機器上安裝gc庫

用法示範:
1. 把GC作爲內存泄漏的檢測工具, 方法如下:

01. #include "../gc/include/leak_detector.h"
02.  
03. int main()
04. {
05. int *p[10];
06. int i;
07. GC_find_leak = 1;
08. //如果去掉這一句,就變成了標準的GC功能,這一句使它按內存檢測方式運行
09. for (i = 0; i < 10; ++i)
10. {
11. p[i] = (int*)malloc(sizeof(int)+i);
12. }
13. for (i = 2; i < 10; ++i)
14. {
15. free(p[i]);
16. }
17. for (i = 0; i < 9; ++i)
18. {
19. p[i] = (int*)malloc(sizeof(int)+i);
20. }
21. CHECK_LEAKS();
22. //標準GC不需要這一句,這裏強制GC_gcollect();
23. }

編譯運行如下:
gcc a.c -lgc -ldl 或者 gcc a.c libgc.a -lpthread
./a.out
顯示:
Leaked composite object at 0×805bff0 (b.c:10, sz=5)
Leaked composite object at 0×805afe8 (b.c:10, sz=4)

當我們調試結束後,可以把檢測去掉就可以了.
2.一個更有意義的做法是,我們使用標準GC的功能,那麼我們根本不用釋放申請的內存,不用時就忘掉它好了.

01. #include "../gc6.1/include/gc.h"
02. #define malloc(n) GC_malloc(n)
03. //這樣可以方便的使用而不改程序中原有的malloc
04. #include ;
05. int main()
06. {
07. int i;
08. char *p;
09. for (i = 0; i < 10000; ++i)
10. {
11. p =  malloc(100000*sizeof(int));
12. //malloc許多次,沒有free
13. if(p==0)
14. {
15. printf("No memory/n");exit(1);
16. }
17. }
18. }

編譯 gcc b.c -lgc -ldl 或者 gcc b.c /usr/local/lib/libgc.a -lpthread
./a.out &
運行時,不會把內存用光的.不會顯示No memory信息.

轉自:http://www.gomudemi.org/?p=43


void Cgct1Dlg::OnBnClickedButton1()
{
    // TODO: Add your control notification handler code here
    //AfxBeginThread(run, NULL);//不能這樣用,可能是要和 libgc 專用的線程啓動函數配合才行
    //AfxBeginThread(run2, NULL);//不能這樣用,可能是要和 libgc 專用的線程啓動函數配合才行
    GC_beginthreadex(NULL, 0, run, NULL, 0, NULL);
    _beginthreadex(NULL, 0, run, NULL, 0, NULL);//#include <gc.h> 後才能自動 gc
    //run(NULL);
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章