VC6使用--(1)
来源:互联网 发布:电脑淘宝怎么开店 编辑:程序博客网 时间:2024/06/05 21:49
本章讲讲Visual studio 6.0,主要讲C++.
偏重讲解,为什么,visual studio已经出了这么多版本,为什么我们要讲VC6。
第一个,学习使用VC6的BSC.
这个功能,只有VC6有。只有VC6才能精确定位,到底是什么地方进行了定义,
这个功能,也许有人觉得,用visual studio的高版本,或者是visual assistant的功能,也行,但事实不是这样,举例来说吧:
现在有这样一段代码:
#ifdef __cplusplus
extern "C"
#endif
XS_EXTERNAL(boot_PadWalker); /* prototype to pass -Wmissing-prototypes */
XS_EXTERNAL(boot_PadWalker)
{
。。。
}
我们想知道宏:XS_EXTERNAL的定义是什么。
这个例子,一个具体的实例,是编译一个用于PERL扩展的动态库的具体过程中,我遇到的情况。
因为用VC编译之后,动态库的函数没有导出。
我要找出这个错误。
然而定义是这样的:
#undef XS
#undef XS_EXTERNAL
#undef XS_INTERNAL
#if defined(__CYGWIN__) && defined(USE_DYNAMIC_LOADING)
# define XS_EXTERNAL(name) __declspec(dllexport) XSPROTO(name)
# define XS_INTERNAL(name) STATIC XSPROTO(name)
#endif
#if defined(__SYMBIAN32__)
# define XS_EXTERNAL(name) EXPORT_C XSPROTO(name)
# define XS_INTERNAL(name) EXPORT_C STATIC XSPROTO(name)
#endif
#ifndef XS_EXTERNAL
# if defined(HASATTRIBUTE_UNUSED) && !defined(__cplusplus)
# define XS_EXTERNAL(name) void name(pTHX_ CV* cv __attribute__unused__)
# define XS_INTERNAL(name) STATIC void name(pTHX_ CV* cv __attribute__unused__)
# else
# ifdef __cplusplus
# define XS_EXTERNAL(name) extern "C" XSPROTO(name)
# define XS_INTERNAL(name) static XSPROTO(name)
# else
# define XS_EXTERNAL(name) XSPROTO(name)
# define XS_INTERNAL(name) STATIC XSPROTO(name)
# endif
# endif
#endif
这个还是相对简单的,但也够瞧的,到底哪个分支才是呢?
是,虽然有经验的程序员,能猜到是哪个,但也不容易,我们猜到是这个分支:
# define XS_EXTERNAL(name) XSPROTO(name)
而实际上,应当走
这个分支。
#if defined(__CYGWIN__) && defined(USE_DYNAMIC_LOADING)
# define XS_EXTERNAL(name) __declspec(dllexport) XSPROTO(name)
但如果你用的是VC6,那就不用头疼了。
右键“Go to defintion of XS_EXTERNAL",然后就到了真正那个宏的定义之处,如果没找到,而你确信有定义,那么就必然在工程设置里预定义的。
*********************************
好了,来看看,如何添加bsc文件。
选记住一个快捷键: Alt+f7
打开工程设置,走到这一个tab:
确保这些设置都正确,然后编译工程,只要能编译过,不需要链接成功,就可以准确定位了。
定位到错误的那行,然后更正成为这样:
define XS_EXTERNAL(name) __declspec(dllexport) XSPROTO(name)
好了,我们再看看,问题,是否得到了修复:
利用工具depends:
好了,出来了。
顺便说一下,这个PadWaker.dll ,是perl的调试用库。类似xDebug对php的作用。
*************************************
然而问题,并没有解决
正确的结果是这样的:
还有一个函数没有导出,经过仔细的研究,
define XS_EXTERNAL(name) __declspec(dllexport) XSPROTO(name)
这句话,不可能达到这样的效果。
那么是什么呢?
原来是在.def文件中定义的:
LIBRARY "PadWalker"
EXPORTS
boot_PadWalker
_boot_PadWalker = boot_PadWalker
把PadWalker.def 加入工程,效果出来了。
- VC6使用--(1)
- 实验1-1 VC6.0的使用
- vc6 配置使用 boost 1.34.1
- VC6使用小记
- VC6 IDE使用备忘
- vc6中使用数字签名
- VC6 使用技巧大全
- VC6使用技巧
- vc6.0 使用GDI+
- vc6使用unicode
- VC6下使用STLPort
- vc6使用unicode
- VC6使用模板
- VC6 使用GDI+
- VC6.0使用技巧
- VC6使用UNICODE问题
- VC6 中使用GDIPlus
- VC6.0使用技巧
- STM32F103VCT6+W5500 UDP通信成功
- windows app store 应用推荐
- Expression Blend实例中文教程(10) - 缓冲动画快速入门Easing
- hive分析函数应用
- 一、关于读取xls 格式Excel表格的方法
- VC6使用--(1)
- MyEclipse6.5的速度性能优化大提速(转)
- Expression Blend实例中文教程(9) - 行为快速入门Behaviors
- vim去掉windows文本的多余的回车符(^M)
- oracle中的截取,模糊匹配小结
- myeclipse8.6安装jbpm插件
- 内循环累加
- 题目1117:整数奇偶排序
- 直接拿来用!最火的Android开源项目