有点急,本来以为没问题的,问一个静态lib的问题

QQ_370566617 2006-10-05 05:12:35
使用VC6
h中这样定义
#ifndef __H_
#define __H_

namespace h
{
void fun();
}
#endif

在cpp中
using namespace h
void fun()
{
}

产生的一个静态lib库

在另一个工程中加入这个库,
并且包含头文件

这样使用
h::fun();

但是编译却说:
error LNK2001: unresolved external symbol
...全文
246 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
hailongchang 2006-10-06
  • 打赏
  • 举报
回复
你所说的lib可以分为两种情况:

1:这个lib是一个静态库,在这种情况下,链接器并不是把整个lib都包含进去,其实只是把你需要的函数给包含进去了,所以这种情况对dll大小的影响非常小.举个例子,你机器上的的MFC静态版本
NAFXCW.LIB大小有16M之多,但是你随便写一个MFC静态链接的程序,可以看到你的最终可执行文件并没有大于16M

2:这个lib是一个dll的导入库,这种情况就如楼上所说的那样,代码在各自的dll中,所以最终大小也不会很大.

============================
dll就没有继承性吗?
比如A中加入了lib
B.dll继承了A.dll 就不用加入lib了?
============================

一个lib,其实只是告诉链接器代码中未定义的符号在lib中能有个合理的"解释"(对于静态lib,就是在lib中已经有这个符号的定义,对于dll的lib,只是告诉链接器哪个dll中有这个符号的定义),
也就是说lib本身是与你写的程序分离的,它只是在链接过程中起点作用,既然是分离的东东,就不能要求在你的代码中有继承性

A中加入了lib,那么B中要想使用这个函数或变量,可以在A中把该函数或变量导出,那么在B中就可以使用了.
qtext 2006-10-05
  • 打赏
  • 举报
回复
一个Dll中引用另一个Dll中的函数,此DLL只增大很小一点点,因为代码是放在各自的dll中,很多输入库(lib),加入一个DLL工程中并不会使此DLL增大很多,link时并不是把输入库的内容放入EXE中,它只是为LINK提供信息。
QQ_370566617 2006-10-05
  • 打赏
  • 举报
回复
※※※※※※※※※※※※※※※※※※※※

还有个问题
如果有n个互相依赖的dll工程(比如A依赖与B),分别用到一个lib中的函数,变量等等

每个dll是不是都要吧lib加进去

这样岂不是让的dll越来越大
dll就没有继承性吗?
比如A中加入了lib
B.dll继承了A.dll 就不用加入lib了?
hailongchang 2006-10-05
  • 打赏
  • 举报
回复
这个带名字空间的全局变量放在h中还是cpp中

放在.h中和放在.cpp中是一样的,但是放在.h中可以给用户使用,否则一般用户无法知道你这个变量是导出的.

使用的时候还要extern吗?

qtext 2006-10-05
  • 打赏
  • 举报
回复
变是一般都在cpp中定义,使用时要用extern 声明。
QQ_370566617 2006-10-05
  • 打赏
  • 举报
回复
还有个问题想问
在lib中想放个变量
不是static的

希望如果有名字就使用名字的

这个带名字空间的全局变量放在h中还是cpp中

使用的时候还要extern吗?

qtext 2006-10-05
  • 打赏
  • 举报
回复
你的fun要放在namespace中
namespace h
{
void fun()
{
.....
}
}

64,652

社区成员

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

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