为什么我的动态库.dll 链接的时候明明选的是静态库lib,最后却依赖于其他.dll?

bandaoyu 2018-05-23 08:40:54

用VS2010 编写的动态库my.dll,

vs my工程->属性->链接器->常规:附加库目录选择的 我自己的lib文件夹,里面有my.dll 依赖的静态库 dpende1.lib,dpende2.lib
vs my工程->属性->链接器->输入:附加依赖项:填的是dpende1.lib,dpende2.lib

然后 配置:活动release 平台:活动Win32

生成my.dll 给python调用,报错OSError: [WinError 126] 找不到指定的模块。


用vs tool工具查看my.dll的依赖项:
(方法见:https://blog.csdn.net/lyncai/article/details/11784471)

显示的结果是:

D:\>dumpbin /dependents my.dll
Microsoft (R) COFF/PE Dumper Version 10.00.30319.01
Copyright (C) Microsoft Corporation. All rights reserved.


Dump of file my.dll

File Type: DLL

Image has the following dependencies:

dpende1.dll
dpende2.dll
MSVCR100.dll
KERNEL32.dll

Summary

1000 .data
2000 .rdata
1000 .reloc
1000 .rsrc
9000 .text

D:\>




这是为什么呢? 我明明工程依赖的是lib库呀,这样一来,我要用这个my.dll还得拖家带口的带上 dpende1.dll, dpende2.dll才行?不是已经链接进到my.dll里面了吗?有谁知道该怎么弄吗?
...全文
1198 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
www_adintr_com 2018-06-01
  • 打赏
  • 举报
回复
重新编译 dpende1, dpende2 把工程的配置类型改成 静态库(.lib), 而不是 动态库(.dll)
bandaoyu 2018-06-01
  • 打赏
  • 举报
回复
顶顶顶顶顶顶顶顶顶顶
幻夢之葉 2018-05-27
  • 打赏
  • 举报
回复
引用 4 楼 bandaoyu 的回复:
所以我的问题转为 如何生成静态库 而不是导入库?)
你只能控制你的工程为静态库,你依赖的lib是静态库会嵌入到你的lib中,否则你还是需要带上依赖的dll给用户
bandaoyu 2018-05-27
  • 打赏
  • 举报
回复
引用 5楼幻夢之葉 的回复:
[quote=引用 4 楼 bandaoyu 的回复:] 所以我的问题转为 如何生成静态库 而不是导入库?)
你只能控制你的工程为静态库,你依赖的lib是静态库会嵌入到你的lib中,否则你还是需要带上依赖的dll给用户[/quote]我有依赖的导入库的工程,我应该怎么样把它编译成真正的静态库?要不然给第三方使用还得带上其他dll很不方便
bandaoyu 2018-05-26
  • 打赏
  • 举报
回复
引用 1 楼 paschen 的回复:
lib有分导入库l和静态链接库,前者实际的执行代码位于动态库中,导入库只包含了地址符号表等,确保程序找到对应函数的一些基本地址信息
原来如此!! 那么怎么样才能确保生成的是静态库而不是导入库呢? 导入库给第三方使用不方便,希望自己最终生成的DLL 不依赖于任何dll库,如何才能实现?
bandaoyu 2018-05-26
  • 打赏
  • 举报
回复
引用 3 楼 jianwen0529 的回复:
你使用到其他dll那么肯定有依赖的 你……
“ vs my工程->属性->链接器->常规:附加库目录选择的 我自己的lib文件夹,里面有my.dll 依赖的静态库 dpende1.lib,dpende2.lib vs my工程->属性->链接器->输入:附加依赖项:填的是dpende1.lib,dpende2.lib” 我的问题是,我的工程里面没有引用dll库,我引入的都是.lib文件。(当然这个问题paschen 老师已经告诉我 了,原来那些lib 不是静态库,而是导入库,也就是那些lib不独立还依赖于同名dll。所以我的问题转为 如何生成静态库 而不是导入库?)
幻夢之葉 2018-05-26
  • 打赏
  • 举报
回复
你使用到其他dll那么肯定有依赖的 你编译成静态库只是说你的工程生成一个lib,用户可以把此lib内嵌进exe或者dll中。 如果你的代码完全只是依赖系统自带的(比如c运行库),那么你就不需要打包依赖的dll给用户 但是你使用到第三方动态库(甚至vc的某些库)那你也需要打包
paschen 版主 2018-05-24
  • 打赏
  • 举报
回复
lib有分导入库l和静态链接库,前者实际的执行代码位于动态库中,导入库只包含了地址符号表等,确保程序找到对应函数的一些基本地址信息
MSVC vs. MinGW 之 (lib,dll,def,obj,exe) vs (a,dll,def,o,exe) 玩转攻略手记 一份粗糙的研究记录,有待补完和整理。 MinGW: c -> o gcc -c a.c c -> exe gcc a.c libs.o -o a.exe (从主程序a.c,附加libs,生成a.exe) o -> exe gcc a.o b.o ... -o main.exe c -> dll,def,a gcc a.c -shared -o a.dll -Wl,--output-def,a.def,--out-implib,liba.a a -> dll a2dll liba.a dll -> a: dlltool --dllname a.dll --def a.def --output-lib liba.a (需要def文件) a -> def: dumpbin /exports lib.a > lib.def (在windows上调用,def需要修改) dll -> def : pexports a.dll -o > a.def (这里的-o是指给函数标序号) lib -> def : reimp -d a.lib lib -> a: (for __cdecl functions in most case) reimp a.lib; (for __stdcall functions) MSVC: c -> lib cl /LD a.c (注意已经定义了export列表) c -> dll cl /LD a.c c -> obj cl /c a.c c -> exe cl a.c /out:a.exe dll ->lib lib /machine:ix86 /def:a.def /out:a.lib (需要def文件) obj ->lib lib a.obj b.obj... /out:mylib.lib dll ->def DUMPBIN a.dll /EXPORTS /OUT:a.def (生成的def需要做修正) lib ->def reimp -d a.lib (这个要在MSYS+MinGW下用) 关于这些工具的适用范围可以很容易的理解和记忆。 dll和exe都是PE文件,所以可以使用pexports. lib和a是静态库文件,都是归档类型,不是PE格式。所以不能使用pexports. dll可以使用dlltool. lib可以使用lib, 和reimp(lib->a工具) 所有的bin文件,包括dll,exe,lib,a都可以使用dumpbin. 参考: http://hi.baidu.com/kaien_space/blog/item/5e77fafa2ba9ff16a8d3110a.html Mingw官网文档: http://www.mingw.org/wiki/MSVC_and_MinGW_DLLs http://oldwiki.mingw.org/index.php/CreateImportLibraries http://www.mingw.org/wiki/FAQ http://hi.baidu.com/opaquefog/blog/item/9b21b6deb324e25dccbf1ab7.html http://qzone.qq.com/blog/8330936-1238659272 http://hi.baidu.com/jzinfo/blog/item/b0aa1d308de99f9da8018e00.html 本篇测试用代码: 1. main.cpp #include #include #include "mylib.h" using namespace std; int main() { char str[]="Hello world!"; printhello(str); return 0; } 2. mylib.cpp #include #include #include "mylib.h" using namespace std; void EXPORT printhello(char *str) { cout << str << endl; } 3. mylib.h #define EXPORT __declspec(

64,643

社区成员

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

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