libgc 加 .mak 在 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



posted on 2012-01-18 13:12 clq 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/-clq/archive/2012/01/18/2325428.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GNU libiconv-1.15和libintl-0.19.8.1,VS2017工程和 Makefile.mak 命令行编译文件 CSDN-tags: libiconv1.15 libintl-0.19.8.1 VS2017 SDK17134.12 声明: 最新版,修正了relocatable.c文件GetModuleFileName函数的问题。在ANSI下,等同于:GetModuleFileNameA;Unicode下等同于:GetModuleFileNameW,如果你的程序出错,请检查。 代码为本人良心制作,虽然花费了一定的时间和精力,但不保证完全没有错误。如果您下载并使用了本代码,将其包含在您发布的应用,给您带来了经济上,心理上,生活上的损失,本人不负有责任。 所有代码都基于官网进行修改,iconv的代码来源于libiconv-1.15的lib目录,intl的代码来源于gettext-runtime的intl目录。 intl需要iconv的支持,如果想单独编译不需要iconv的intl, 请自行修改intl目录下的config.h文件, /* Define if you have the iconv() function and it works. */ #define HAVE_ICONV 1 /* Define to 1 if you have the header file. */ #define HAVE_ICONV_H 1 为: /* Define if you have the iconv() function and it works. */ /* #undef HAVE_ICONV */ /* Define to 1 if you have the header file. */ /* #undef HAVE_ICONV_H */ 并修改VS工程预处理器定义,删掉/DDEPENDS_ON_LIBICONV=1 VS的工程为VS2017的工程文件,使用VC141工具集,SDK10.0.17134.12,如果没有2017,也可以用Makefile.mak文件来编译。 或者你自己降低版本,我最初使用的最低版本是VC140_xp,SDK7.1A,也就是VS2015默认安装的兼容xp工具集,VS2015以下版本未测试。 nmake /f Makefile.mak [DLL] [DEBUG] 指定 DLL=1 编译dll版本,默认是lib版本,libiconv.lib , libintl.lib。 指定 DEBUG=1 编译debug版本,默认是release版本。 同理,如果intl不需要iconv,请修改上面的配置文件选项,并, 删掉Makefile.mak/DDEPENDS_ON_LIBICONV=1 配置文件的制作,参考了以下几处,修改的大概原则是,能定义的全定义了,就这样: https://github.com/kahrl/gettext-msvc 这个地址提供了libiconv和libintl的VS工程和配置文件。 https://github.com/winlibs 为编译PHP而修改的libiconv和libintl源码。 附带的Cygwin目录的工具 libiconv官方的制作文档,用cygwin配合VC,生成的配置文件。 一大堆的宏和函数搞得我头晕脑涨。所以配置文件如果有错误,也在所难免,所有修改的文件,如config.h,iconv.h,libintl.h都附带了原始文件。 如: 配置文件 原始文件 DLL原始文件 LIB原始文件 config.h config.h.in iconv.h iconv.h.build.in iconv.h.in localcharset.h localcharset.h.build.in localcharset.h.in libintl.h libgnuintl.in.h 欢迎同学们下载测试。有问题可以给我发邮件[email protected]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值