修改头文件为什么不影响导出动态库的调用

louxingwa0811 2018-05-23 05:01:22
有一个导出库test,提供了test.h test.lib test.dll

//*****************test.h**********************
#include "aaa.h"
class AFX_EXT_CLASS Ctest
{
public:
...

char * m_szPath;

BOOL Init(void);
void Quit(void);
BOOL Read(char *buf);
};
//******************************************

现在一个工程demo,包含demo.cpp和demo.h,调用test

demo.h中include了test.h,

//****************demo.h**********************
#include "aaa.h"//和test.h里面的aaa.h不一样,不在同一个位置
#include "test.h"
Ctest *pCtest;
//******************************************


//*****************demo.cpp*********************
...
pCtest->Init();
pCtest->Quit();
pCtest->Read(buf);
...
//******************************************

demo.h本身include了一个同名的aaa.h,但是内容不一样,导致了冲突,编译不了。

但是修改一下test.h,注释#include "aaa.h",甚至注释char * m_szPath;后都能编译,而且能正常使用。

//*****************test.h修改**********************
//#include "aaa.h"
class AFX_EXT_CLASS Ctest
{
public:
...

// char * m_szPath;

BOOL Init(void);
void Quit(void);
BOOL Read(char *buf);
};
//******************************************

如果把demo.cpp调用了的函数也注释,就无法编译,会报错

//*****************test.h修改**********************
//#include "aaa.h"
class AFX_EXT_CLASS Ctest
{
public:
...

// char * m_szPath;

// BOOL Init(void);
void Quit(void);
BOOL Read(char *buf);
};
//******************************************

test.lib 和 test.dll是没有改变的,难道修改test.h不会影响test.dll的使用吗?test.h只是提供一个原型吗?头文件,导入库,动态库在编译和运行的时候都是怎样一个过程?
学艺不精,还请各位高手指点指点,不胜感激。
...全文
1100 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
百合杰 2018-05-24
  • 打赏
  • 举报
回复
引用 1 楼 paschen 的回复:
看了半天,没懂要表达的意思 推荐本书:《程序员的自我修养——链接、装载与库》
好像不错 准备看 谢谢
oowgsoo 2018-05-24
  • 打赏
  • 举报
回复
简单的说,当你用AFX_EXT_CLASS声明导出Ctest类中的三个函数: BOOL Init(void); void Quit(void); BOOL Read(char *buf); 编译器会将这三个函数名称重整为: Ctest::Init_this_V; Ctest::Quit_this_V; Ctest::Read_this_Charp; 基本上就是要处理类名,函数名,函数参数等,不同的编译器有不同的编码规则。但统一的需求就是必须保证函数名称的唯一性,同时要快速地在名称在函数声明之间切换。 lib中记录这些导出函数的信息和dll中的地址 当客户端调用这些函数时,它首先要根据.h文件进行导出,其实就是把函数名称重整又玩了一遍,然后看看相应的lib中有没有相应的导出信息,将所有函数调用的地方改成相对dll的地址。这些是在链接时就搞定的。 在执行程序是,需要动态加载dll,这时还需要一个函数的相对dll地址转换为绝对的dll地址的过程。 .h文件只要把改写的内容写清楚了,其它的不重要,加点代码和注释都不会影响什么。所以,只要你要清楚地知道自己在干什么,并操作正确,编译器就能正确的工作。比起人来,编译器真是傻得太多了。
jianminfly 2018-05-24
  • 打赏
  • 举报
回复
《Windows核心编程》
paschen 版主 2018-05-23
  • 打赏
  • 举报
回复
看了半天,没懂要表达的意思 推荐本书:《程序员的自我修养——链接、装载与库》

64,653

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧