关于静态链接库

lyyscf 2012-06-23 12:26:58
最近遇到一个的问题,今天有空做了点测试,恍然大悟

项目里面的对象是动态创建的,做法类似下面
//CTest.h
class CTest : CBase
{
public : virtual void process();
...
}
//CTest.cpp
REGEDIT_CREATE_CLS(CTest)
void CTest::process(){...}

//create.h
#define REGEDIT_CREATE_CLS(CLASS) \
static CBase * gCreate##CLASS(){\
return new CLASS();\
}\
int gnCreate##CLASS = regeditClass(#CLASS,gCreate##CLASS);


regeditClass函数的作用就是把类名和函数作个关联

主程序是类似这样处理的
    CBase * pBase = createbyname("CTest");
if(NULL == pBase) return;
pBase->process()
...


看上去没什么问题,确实,正常情况下是没问题
但是,当这样的类放在一个静态链接库里的时候呢?

居然找不到,也就是说createbyname返回的是个零。
为什么呢?静态链接库不就相当于cpp文件编译后的obj打了个包吗?
难道一直理解错了?难道静态链接库和主程序的全局变量分配的空间不一样?

百思不得其解,
趁今天有空做个程序调试,在regeditClass下断点,居然没有进去,把活动工程换成
静态链接库的工程,还是没有进。

难道静态链接库里的全局变量没被初始化,或是不会调用函数来初始化?
怎么看有没有初始化呢?直接构造一个CTest,进构造函数,监视那个gnCreateCTest看看。
好了,在main函数的最开始写上CTest tmpTest,再调试,居然进了regeditClass!

顿时,恍然大悟,显然这个类文件的obj在链接的时候被忽略了
也就是说静态链接库在链接的时候,如果有些类没有被使用,它是不会被链接的,即使你有包含头文件,或声明.
但是在主程序中,就算没有包含头文件,也是会被链接的。

(用的是vc6.0其他编译器就不清楚了,希望不会误导别人)


...全文
108 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq120848369 2012-06-23
  • 打赏
  • 举报
回复
没看见createbyname在哪里.
bsnry 2012-06-23
  • 打赏
  • 举报
回复


CBase * pBase = createbyname("CTest");
if(NULL == pBase) return;
pBase->process()
...


createbyname 这函数是否没有调用???

楼主写的文字太多, 没有看懂

我记得static library 写好就行了,


64,318

社区成员

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

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