动库加载问题

来源:百度知道 编辑:UC知道 时间:2024/05/05 09:08:12
前两天,问过这样的问题:我开发一个动库,此动库要使用另一个动库(此动库没有源文件,只有导出信息)的部分导出信息,但我在发布我开发的动库时,只想发布我开发的动库,对其所依赖的另一个动库不想带上,那如何来实现呢?
大家给我的答案是不能,只有带上所依赖的动库,因为这个动库没有源文件(由于是产品,商家不给提供),并且我也不知道这个动库算法,后来,我又听某些人说,你可以让商家提供给你一个比较大一点的lib文件,那他的所指的lib文件是静态库,还是动态库中的lib文件变大一些的呢?
动态库可以转换为静态库吗?
另外,产生动态库的程序可以让其链接文件(lib文件)包含动库的所有信息吗(即不只包含链接信息)?

还有我前两天,在csdn上看到有人对这个问题的看法是:使用重载,我不太明白这样的回答,有谁知道是什么意思吗?

谢谢各位了。
谢谢你的回答,对以你的回答我有以下疑问:
1)你说:“如果不想直接在发布时附带使用的动态库,要么使用静态库lib”。
疑问:其中提到的静态库是指我所依赖的库文件应该是静态库吧?
2)你说:“另外,...而且程序异常时往往无法删除释放的文件。”
疑问:你说的这个方法是什么意思,这样的话,我所依赖的那个库就可以是动态库吗?
3)你说:“最后,...但是实现起来有些复杂。”
疑问:您说的这个方法,我没有看明白,能给我讲细一点吗?多谢啊。

呵呵,或许吧,其实我也清楚第二位回答者所说的,但我们单位要求我试试看看能不能单独发布我做的动库,而不附带依赖库。由于我的编程经验还不到一年,置于能不能这样做也不清楚,就来问大家了,大家不要见怪啊,o(∩_∩)o...
其实我感觉也是,如果不想附带依赖库,那依赖库就应该为静态库,如果无所谓带不带,最好使用动态库,毕竟动态库有很多优势,比如资源的节省和共享等。而动库的加载无非就那两种方式。
我问这么多的原因,在开始就说明白了:我单位同事的老师说,有个比较复杂的方法能够实现,提到lib文件了。具体怎么实现,我也不清楚,就来问大家了,暂不结贴了。

如果不想直接在发布时附带使用的动态库,要么使用静态库LIB(这可不是动态库的副产品,而是完全单独的产品,独立链接到你的应用中去的),要么要求用户自备该动态库。另外,有个取巧的办法,把动态库作为你的应用程序的资源文件,然后在运行时释放到程序目录,程序退出时删掉。不过这样就不能使用动态库的静态链接方法(头文件+LIB)而只能动态加载(LoadLibrary+GetProcAddress)而且程序异常时往往无法删除释放的文件。最后,还有将动态库作为内存数据来加载(实现PE加载器)的方法,这样最为干净清透,但是实现起来有些复杂。
----
1)如果你使用那个动态库时所用的方法是头文件+LIB的形式,那个LIB只是动态库中输出函数的信息,而不是静态库,所谓静态库是一个单独的LIB文件,如果你使用的库只有头文件和一个LIB而没有其他东西,你才能在发布时不附加任何东西。
2)还是那句话,如果你通过头文件+LIB文件来访问动态库,那么这种方法是无效的,因为应用程序将在PE加载时刻就加载所有的DLL文件,这种模式叫Implicit linking。想使用资源来创建DLL,只有在使用的时候采取LoadLibrary+GetProcAddress的方式,这种模式叫Explicit linking。参考MSDN里面的《Linking an Executable to a DLL》。
3)PE加载是操作系统运行一个文件时进行的操作,它会将exe文件和相关的DLL加载到内存,然后运行它。我说的就是模仿操作系统的工作形式将动态库加载到内存里,然后调用里面的过程。这个实现过程比2的要麻烦许多,不推荐。
----
发现你好像对两种库和动态库的两种加载方式有点搞混淆了。
----
运行时是否需要动态库文件“一定存在”,搜索“直接运行内存中的程序”看看吧,言尽与此。

什么乱七八糟,
如果你用到别人的dll里面的函数。那么你的程序运行的时候电脑里面必须有这个dll文件的存在。也就是说你发布的时候,别人机器上没有这个dll的,你的程序就运行不了。所以一定要提供这个dll文件给别人。

至于 采用“ LoadLibrary+GetProcAddress”方式调用(动态调用) 还是 “