DLL隐式连接找不到头文件,新手问题

sdfdl 2009-01-21 04:22:34
操作:
1、在mfc里面建立一个dll工程,位置在目录A,完毕,在debug目录里面有一个lib文件和一个dll文件
2、在mfc里面建立一个exe工程,位置在目录B,完毕,把A的lib和dll文件拷贝过去
3、在exe工程里面按alt+F7,然后输入lib文件的名字,然后再在左侧文件视图里面右键,选择『add files to project』,把lib文件添加进去。
4、在调用dll的函数的文件头加入#include "xxxxx.h"
5、编译,提示找不到"xxxxx.h"文件,把头文件拷贝过去可以运行……

问题:
找到的教程都是说要『包含』dll的头文件,这个『包含』到底是指『include』还是说『include』之余还要把头文件『包括』在B目录下面(估计我的中文老师要哭了)?还是说我操作有误?如果要使用网上别人发布的dll库,那么这个库里面也必须有dll、lib和h文件吗?
...全文
244 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
SurgePing 2011-08-27
  • 打赏
  • 举报
回复
不错的帖子0 。0
cnzdgs 2009-01-22
  • 打赏
  • 举报
回复
这里指的是include,文件在哪里都可以,但要给出路径,如果include后面只写文件名而没有路径,则需要文件在当前目录中。
DLL是执行文件,必须要有,如果明确知道各个接口的定义,可以没有H和LIB。
dengniancai 2009-01-22
  • 打赏
  • 举报
回复
啊 这个贴结了啊, 害我白忙活了.
dengniancai 2009-01-22
  • 打赏
  • 举报
回复
1. 加入 lib 文件有 3 中方法:
(1) 直接照 楼主的方法『add files to project』. 那样的话就不要在 Alt + F7 中添加了.
(2) 按照 vcPlayer 的方法 在工程设置中的导入库中去添加, VC 6.0 是在 菜单 Project(工程) -> Setting (设置) -> Link (链接) -> Object/library modules 中加入 xxxxx.lib . VS 2003 是在菜单 项目 -> 属性 -> 链接器 -> 输入 -> 附加依赖项 中加入 xxxxx.lib.
(3) 在代码中加入
#include "xxxxx.h" 
#pragma comment(lib, "xxxxx.h")


至于这三个方法的优缺点我至今也没搞清楚, 这三种方法我都用过.

2. 包含的概念就是可以包含你能找到的头文件, 比如你包含 #include <afxwin.h> 时, 我估计你从来没有想过将这个头文件包含在 B 目录下面, 当然包含进来也是可以的. 你有没有想过你为什么不把这个文件包含到 B 目录下呢? 这个头文件在你 VC 安装目录下面 比如我的在 D:\Program Files\Microsoft Visual Studio\VC98\MFC\INCLUDE\afxwin.h 而工程能够找到这个文件, 那他是怎么找到的呢? 你可以打开菜单 Tool -> Options -> Directories, 在 Show directories for: 选择 Include files, 可以在 Directories 列表框中找到 D:\Program Files\Microsoft Visual Studio\VC98\MFC\INCLUDE 这个目录, 所以你包含的时候就不用写 #include "D:\Program Files\Microsoft Visual Studio\VC98\MFC\INCLUDE\afxwin.h" 了.
你有没有想过 #include "afxwin.h" 和 #include <afxwin.h> 的区别, "" 会优先在当前目录下查找, <> 会优先在 Tool -> Options -> Directories 所列出的目录下查找.

3. 你想 #include "xxxxx.h" 有四种方法:
(1) 有如你所说将这个文件拷到 B 目录下面, 这是可行的.
(2) 不拷到 B 目录下也可以, 不过你要写出全部路径, 假如 A 目录是 D:\Test\MFCDll, B 目录是 D:\Test\MFCEXE 的话, 你要写成
#include "D:\Test\MFCDll\xxxxx.h"

这种方法不怎么好, 因为如果 MFCDll 重命名或移动其他目录, MFCEXE 都不能编译通过.
(3) 如果 A 目录和 B 目录如 (2) 假设, 那么你可以写相对路径, 如
#include "..\MFCDll\xxxxx.h"

你也可以不把 LIB 文件拷贝过来, 而使用
#pragma comment(lib, "..\\MFCDll\\Debug\\xxxxx.lib")

上面的 Debug 或许是 Release, 或者是你自定义的输出文件所在的目录, 并注意 "\" 和 "\\" 的区别.
..\ 表示上级目录, ..\..\ 表示上级目录的上级目录.
这要求你要在其他地方运行的话, A 目录和 B 目录要一起移动.
(4) 将 B 目录加到 Tool -> Options -> Directories 的 Include files 目录下. 那样你就可以直接使用 #include "xxxxx.h", 不过如果你把很多目录都加到里面去的话, 会造成混乱, 并且移动目录的话, 这些目录都失效了, 所以这个方法不推荐.

4. 如果你自己制作 动态链接库的话, 如果你要调试或者是测试 动态链接库, 你会觉得你这种从 A 目录拷到 B 目录的方法会很麻烦, 比如你改了 MFCDll 的 某些文件重新编译链接 的话, 你要将 xxxxx.h, xxxxx.lib, xxxxx.dll 都要拷过去, 或许你按照我第 3 点讲的第 (3) 种方法, 只需要拷 xxxxx.dll 就可以了, 但是那也是比较麻烦的, 或许你有时就忘了拷, 不要着急, 也有几种方法让你一个文件也不用拷, 并且方便 MFCDll 的调试.
(1) 将 EXE 的工作目录放在 DLL 输出文件的目录下 (菜单中 Project -> Setting -> Debug 的 Working directory 填入 DLL 输出文件目录), 可以用来测试 DLL. 调试 DLL 时, 在 Project -> Setting -> Debug 的 Executable for debug session 中填入 Exe 所在的路径, 这样就可以实现 DLL 的调试.
(2) 可以参见 http://topic.csdn.net/u/20081015/16/6c7712c9-ebc7-4bcf-9ef9-fdc07d906fa2.html 中 10 楼, 12 楼, 16 楼的方法.
就是将你的 Dll, EXE 的输出文件放在同一个文件夹下. 这个方法是我所推荐的.

5. 同意 2 楼, 3 楼的说法, 不过我一直都只会用 .h, .lib 和 .dll 一起用, 只用 .dll 或只用 .dll 和 .h 的方法我还不怎么会, 还望 2 楼, 3 楼指点.
sdfdl 2009-01-22
  • 打赏
  • 举报
回复
谢谢楼上各位解答~~~
oyljerry 2009-01-21
  • 打赏
  • 举报
回复
使用别人发布的dll,需要有h,dll文件,最好有lib文件这样你可以直接link,调用
vcPlayer 2009-01-21
  • 打赏
  • 举报
回复
不是添加LIB文件,而是H文件!

LIB文件是在你的工程设置中的导入库中去添加!

或者不用添加文件,在包含语句里面写上全路径!!

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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