注册 登录
编程论坛 C++教室

依然是静态库编译问题

BianChengNan 发布于 2012-03-08 16:39, 2107 次点击
接上贴
求解答(关于库编译)
我想编译一个自己的库,(假定叫MathLib),在库中调用了另外一个库的函数,假设是BaseCalcLib中的函数。
弱弱的问一下,我怎么才能用BaseCalcLib的函数呢?
我知道的有如下几种方法:
1.LoadLibrary 显示加载
2.用#pragma comment 加载BaseCalcLib库。包含对应的头文件
3.在工作区中添加BaseCalcLib库。包含对应的头文件

有没有这么一种方法,只引用BaseCalcLib的头文件就可以使用BaseCalcLib库中的函数呢?

ps:我在看公司的一个库的工程设定时发现了我所问的情况,个人感觉是不可以的。如果有知道的高手,请不吝赐教。多谢多谢
-----------------------------------------------------------------------------------------------------------------------
我现在得到的结论如下:
编译静态库时,并不需要知道每个函数的实现代码,因为库本身不能执行。
当某个exe文件需要调用这个静态库时,就需要解决所有调用。也就是说找到所有调用函数的函数体。这时候必须把用到的库都加到当前exe的工程中。

具体是怎么实现的我也不清楚,依然在调查中,希望看到帖子的兄弟可以一起想想,有知道的兄弟请指点,多谢

15 回复
#2
非死亡!2012-03-08 17:54
这个  这个 我会的  你一定会  你会的  我不一定会  不能帮你啊   我只能祈祷了
#3
tisyang2012-03-08 19:49
静态库理解还好,都是编译好的二进制代码,需要用到的时候提供头文件和lib库文件,链接的时候就可以直接把静态库中的代码链接到最终的可执行文件中去了。
#4
lz10919149992012-03-08 20:30
链接的时候需要BaseCalcLib库文件,其实用#pragma comment就是链接这个库。
#5
BianChengNan2012-03-09 12:52
我又得到一些新发现:静态库中不能再包含其他的静态库或者动态库。动态库中却可以。
#6
张敏樱木花道2012-03-09 15:10
以我的理解,你说的方法肯是有的。
我的理由是在写socket程序时 我们只是简单的写了
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
我们就可以实现对其中的函数的调用了,我们并没有去拷贝.lib文件到我们的工程中。
那么vc是怎么实现的呢?我认为是vc可以自动重定位这个文件,也就是说在编译或者链接的时候VC会自动的去搜索一个文件夹,而这个文件夹是专门存放.lib文件的。如果你能找到这个文件夹的位置,将你的lib放在里面就可以实现你想要的效果了。也有可能是vc会去搜寻我们的系统目录来找到lib库,毕竟vc和windows是一家。

我在写自己的库的时候也有这个问题,写完DLL后,在一个头文件中声明所有的导出函数,也老是每次都要拷贝lib文件,挺烦的,现在也在解决这个问题。

说得简单一点:你可以将你的lib文件拷贝到vc的安装目录中的lib文件夹下,也许会实现你要的效果。
以上只是个人想法,等晚上有空再去验证一下,告诉你结果。

如果上面的方法不行的话,可以自己开发一个向导。这个一定行。不过技术要求高。
#7
BianChengNan2012-03-09 15:22
以下是引用张敏樱木花道在2012-3-9 15:10:35的发言:

以我的理解,你说的方法肯是有的。
我的理由是在写socket程序时 我们只是简单的写了
#include
#pragma comment(lib,"ws2_32.lib")
我们就可以实现对其中的函数的调用了,我们并没有去拷贝.lib文件到我们的工程中。
那么vc是怎么实现的呢?我认为是vc可以自动重定位这个文件,也就是说在编译或者链接的时候VC会自动的去搜索一个文件夹,而这个文件夹是专门存放.lib文件的。如果你能找到这个文件夹的位置,将你的lib放在里面就可以实现你想要的效果了。也有可能是vc会去搜寻我们的系统目录来找到lib库,毕竟vc和windows是一家。

我在写自己的库的时候也有这个问题,写完DLL后,在一个头文件中声明所有的导出函数,也老是每次都要拷贝lib文件,挺烦的,现在也在解决这个问题。

说得简单一点:你可以将你的lib文件拷贝到vc的安装目录中的lib文件夹下,也许会实现你要的效果。
以上只是个人想法,等晚上有空再去验证一下,告诉你结果。

如果上面的方法不行的话,可以自己开发一个向导。这个一定行。不过技术要求高。
#pragma comment(lib,"ws2_32.lib")
貌似上面这句话就是引用库了吧,不知道兄弟明白我要表达的意思了吗?
#8
BianChengNan2012-03-09 15:23
以下是引用lz1091914999在2012-3-8 20:30:21的发言:

链接的时候需要BaseCalcLib库文件,其实用#pragma comment就是链接这个库。
链接的时候???能说明白点吗?是指生成exe文件的时候吗??
#9
BianChengNan2012-03-09 15:24
以下是引用非死亡!在2012-3-8 17:54:02的发言:

这个  这个 我会的  你一定会  你会的  我不一定会  不能帮你啊   我只能祈祷了
。。。我很菜其实。发帖出来是希望能群策群力,人多力量大,感谢兄弟的关注。
大家一起努力
#10
BianChengNan2012-03-09 15:25
以下是引用tisyang在2012-3-8 19:49:36的发言:

静态库理解还好,都是编译好的二进制代码,需要用到的时候提供头文件和lib库文件,链接的时候就可以直接把静态库中的代码链接到最终的可执行文件中去了。
我的意思是我在一个新的静态库中引用了另外一个静态库中的文件。可是没有包含他。不太明白还是
#11
张敏樱木花道2012-03-09 15:29
回复 7楼 BianChengNan
你是想自己写一个库,就像系统的库一样,只要我们直接调用里面的函数就可以,是这样吗?
你的问题是我们每次都要拷贝我们的。lib文件到我们的exe中去,你想省掉这个步骤,对吗?
#12
张敏樱木花道2012-03-09 15:35
,不好意思啊,没有看到你的第一个贴,所有理解有误。。。。。。
#13
BianChengNan2012-03-12 09:36
以下是引用张敏樱木花道在2012-3-9 15:29:26的发言:

你是想自己写一个库,就像系统的库一样,只要我们直接调用里面的函数就可以,是这样吗?
你的问题是我们每次都要拷贝我们的。lib文件到我们的exe中去,你想省掉这个步骤,对吗?
我现在很想弄明白其中的原理
#14
pangding2012-03-13 01:10
就我的理解:
静态库,就是编译链接之后就绝定一切,所有该有的代码必需都有。凡是要用到库的地方,都必须得获得库的代码,以便链接生成可执行文件。一旦链接完成,代码就是死的,立即就可以执行。动态库就不太一样了。

对编译和链接的实现过程有一定了解的话,就很清楚这之间到底做了什么。
Linux 用的技术大概就是这样。Windows 我不是很懂,动态库的实现方式和 linux 有很大差别,不过静太库好像差不多。
#15
pangding2012-03-13 01:14
动态库在链接不需要获得库的代码,只需要知道库的接口。在执行的时候,才能得知代码究竟在内存的什么位置。由于是在执行时确定,所以称作动态。
实现方式其是就是类似,链接时把调用代码的地址列成一个大表,但内容是瞎写的。执行的时候由系统负责把库代码在内存中的实际位置填回那个表里。
#16
BianChengNan2012-03-15 15:14
以下是引用pangding在2012-3-13 01:14:50的发言:

动态库在链接不需要获得库的代码,只需要知道库的接口。在执行的时候,才能得知代码究竟在内存的什么位置。由于是在执行时确定,所以称作动态。
实现方式其是就是类似,链接时把调用代码的地址列成一个大表,但内容是瞎写的。执行的时候由系统负责把库代码在内存中的实际位置填回那个表里。
应该是版主说得这样了,不过理解的还是不够透彻。不知版主有没有类似的好文章推荐一下,很想把这一块知识明了化。在网上找了很多资料看,都没找到太合适的。
好像还涉及到导入导出表 一块的知识, 然后就是pe结构。。。 真的很晕啊。如果有,还望版主指教啊
1