| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2953 人关注过本帖
标题:请教 关于动态链接库的问题
只看楼主 加入收藏
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
结帖率:99.34%
收藏
已结贴  问题点数:60 回复次数:74 
请教 关于动态链接库的问题
我的目的是制作一个DLL 供自己写程序时调用 我大致的步骤如下 但是没成功
VC6下
FILE --> new ----> project ---> Win32 Dynamic-Link Library 工程名 DllName
FILE --> new ----> file ---> C++ Source File : DllName.cpp
FILE --> new ----> file ---> Text File : DllName.h
FILE --> new ----> file ---> Text File : DllName.def

.cpp
程序代码:
int _stdcall getAge(void)
{
    return 318;
}

void _stdcall getIntArr(int *a,int len)
{
      int i;
      for(i = 0;i<=len;i++)
      {
              *a = i;
      }
}

.h
int getAge(void);

void getIntArr(int *a,int len);

.def
EXPORTS
   getAge
   getIntArr

然后编译 -- 链接 -- 运行 出现这个东西
图片附件: 游客没有浏览图片的权限,请 登录注册
不知咋办

是那个文件名 在他对应的工程文件夹里没找到EXE文件

然后又另建立个工程 console 下的 名字 TestDll
并且把DllName.lib 和 DllName.obj拷贝到其工程文件下后
写了个 cpp文件



程序代码:
#include <stdio.h>

//extern   "c"   int  _declspec(dllimport)   getAge(); 

int main(void)
{
    int i = getAge();
    printf("i = %d", i);
    return 0;
}

编译提示 error C2065: 'getAge' : undeclared identifier 说明没连接上
加上这个
extern   "c"   int  _declspec(dllimport)   getAge();

还提示error C2537: 'c' : illegal linkage specification
怎么解决啊。
搜索更多相关主题的帖子: 链接 project 动态 file 
2012-05-18 12:34
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:60 
基础啊,DLL是不能直接运行的二进制代码。。。看情况你的多工程创建也没有掌握。
静态链结DLL,需要拷贝DLL文件和对应的导入库文件.lib到EXE执行工程中\debug或是release目录中,你可以通过设置工程属性中的Post bulid step那里,就是编译完成后要执行的命令。要注意对应的模式,你不能把Debug的dll 链结到 Release EXE中。
输入两行
cmd /c copy *.dll x:\目的地
cmd /c copy *.lib x:\目的地

在主程序中需要用extern   "c"   int  _declspec(dllimport)   getAge(); 这句进行函数导入。
但这不是一个好的方法,另一个通用办法是制作DLL的头文件中加入宏来往下导入和导出问题。
链结时要加上#pragrm 指令指明导入库或是在项目中指定.lib作为链结库。这个以前告诉过你如何去做的。

[ 本帖最后由 hellovfp 于 2012-5-18 13:24 编辑 ]

我们都在路上。。。。。
2012-05-18 13:02
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
一个workspace工作空间可以创建一个主exe工程 + 多个dll子工程,并可以指定子工程之间的依赖关系.

我们都在路上。。。。。
2012-05-18 13:03
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 2楼 hellovfp
你说的是 #pragma comment(lib, "DLLNAME.lib") 吗


[ 本帖最后由 有容就大 于 2012-5-18 13:13 编辑 ]

梅尚程荀
马谭杨奚







                                                       
2012-05-18 13:05
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
回复 4楼 有容就大
对啊,是这个,偶记不住这个关键字,不好意思,因为里面扩展并不通用,在codeblock里面没有这个的。

我们都在路上。。。。。
2012-05-18 13:07
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
另外用def做为导出文件表的做法早就过时了,
#ifdef EXPORT
    #define DLL   _declspec(dllexport)
#else
    #define DLL  _declspec(dllimport)
#endif

你可以掌握这种形式的,在创建DLL工程的时候,你可以选第二个,或是第三个可以帮你自动生成一些DLL的框架代码。可以看到这种应用。

我们都在路上。。。。。
2012-05-18 13:12
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 3楼 hellovfp
去这么合并了下 怎么指定主次关系?
图片附件: 游客没有浏览图片的权限,请 登录注册


梅尚程荀
马谭杨奚







                                                       
2012-05-18 13:13
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
回复 7楼 有容就大
创建的时候,如图所示,勾选打圈的地方:
图片附件: 游客没有浏览图片的权限,请 登录注册


如果是已经创建好的未指定依赖关系的,可以使用菜单Project/Dependencies...进行指定,VS里面也有类似的方法。

我们都在路上。。。。。
2012-05-18 13:22
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
依赖的意思要要编译我,必须先编译依赖。

我们都在路上。。。。。
2012-05-18 13:25
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 9楼 hellovfp
也就是说 TestDll 依赖于 DLLNAME ?
图片附件: 游客没有浏览图片的权限,请 登录注册


程序代码:
#include <stdio.h>
#pragma comment(lib, "DLLNAME.lib")

int main(void)
{
    int i = getAge();
    printf("i = %d", i);
    return 0;
}
--
这样的吧

梅尚程荀
马谭杨奚







                                                       
2012-05-18 13:34
快速回复:请教 关于动态链接库的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.034752 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved