博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
libgc 加 .make 在 vc6 vs2008 中的编译方法
阅读量:5927 次
发布时间:2019-06-19

本文共 3051 字,大约阅读时间需要 10 分钟。

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));

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

分类:
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信息.

转自:

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);
}

转载地址:http://hievx.baihongyu.com/

你可能感兴趣的文章
Yii提示信息跳转页面
查看>>
我的友情链接
查看>>
在线框架引用|bootstrap|jq|jqmobile|CSS框架_无需整理
查看>>
Ansible自动化安装nginx
查看>>
office2013 excel 打开时提示excel词典xllex.dll文件丢失或损坏
查看>>
链接/Redis
查看>>
PHPWAMP强行脱离依赖,在系统缺失必备组件或DLL受损的情况下依然能正常运行
查看>>
Linux守护进程(init.d和xinetd)
查看>>
AWK--Round函数
查看>>
Nagios监控软件源码安装
查看>>
二维观察---规范化和视口变换
查看>>
Android控件所共有属性ID、宽、高、背景、内容位置、状态、内容跟边界的间隙、边界跟其他控件边界的间隙...
查看>>
最长公共子串,动态规划
查看>>
调整应用程序服务环境,何时执行任务
查看>>
我的友情链接
查看>>
IP与MAC地址绑定
查看>>
python面对对象(一)
查看>>
格式化日期字符串来了 转
查看>>
SQLSERVER2008 数据库可疑的解决方法
查看>>
biji
查看>>