从makefile到调试dll

来源:互联网 发布:手机硬币魔术软件 编辑:程序博客网 时间:2024/05/18 01:24

最近在opensc上下了一个pkcs11的实现。代码真多,不过调理挺清晰,设计蛮合理的。但是这个工程是makefile生成的,想调试一下都没思路。因此在google上搜略了一番,发现没有相似的问题。自己解决吧。主要是解决两个问题,使用makefile生成调试版的dll,并且生成完整的调试信息;使用vs在源码级别上调试这个dll。

问题一:

在http://blog.csdn.net/dyc13/archive/2006/09/01/1154871.aspx和http://hi.baidu.com/bidepan2023/blog/item/29112e1bcbc3141f8618bff9.html两个博客上翻看了vs的编译选项和链接选项后。发现生成调试版的dll和生成调试信息是两件独立的事情。而且只有这两种东西都存在时才能进行正确的调试。而生成完整的调试信息需要编译选项/Zi,生成调试版dll需要指定链接选项的/debug选项。因此在makefile中添加这两个选项即可。

下面是个完整的makefile,这个makefile生成调试版dll并且生成完整的调试信息。假定三个文件,hello.cpp num.cpp num.h.文件内容如下:

// hello.cpp

 

#include "NUM.h"
#include <stdio.h>

void print()
{
 #ifdef HAVE_CONFIG_H
 printf("define\n");
 #else
 printf("not define\n");
 #endif
 __asm int 3;
 show();
}

 // num.cpp

#include <stdio.h>
void show()
{
 printf("show\n");
}

// num.h

#pragma once

void show();

// ex.def

EXPORTS

  print

makefile文件如下:

// makekfile

OPTS = /c /Zi /DHAVE_CONFIG_H
LINKF = /debug

 
all :hello.dll
hello.dll : hello.obj NUM.obj
 link $(LINKF) /dll /def:ex.def hello.obj NUM.obj /out:hello.dll
hello.obj : num.h
 cl $(OPTS) hello.cpp
NUM.obj : num.h
 cl $(OPTS) NUM.cpp

使用vs2008的命令行编译即可得到正确的结果。命令行为nmake -f makefile.mak.

在makefile中/DHAVE_CONFIG_H的意思预定义HAVE_CONFIG_H这个宏。

 

问题二:

生成正确的dll后,下一步就应该是创建一个exe使用对这个dll进行源码级调试了。在vc6上找了半天选项都没有找到相应

的选项,被迫使用vs2008。很快就找到了。使用方法如下:

在工具--->选项--->调试--->符号 中添加生成的pdb文件或者其目录即可。

进行这样一个简单的设置就解决了问题。此时,就可以顺利的进行源码的调试了。其中pdb文件是连接源码和exe的一个桥梁。而且pdb,源码,exe有一定的关联。vs2008可以正确的关联它们。这一点使我们大批量引入pdb文件变得非常方便。

 

搞了一下午才搞出来,真不容易,哈哈。像我这么缺乏决断能力的人能走到最后,觉得自己成功了。


原创粉丝点击