标题:请教 关于动态链接库的问题
取消只看楼主
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
结帖率:99.34%
已结贴  问题点数:60 回复次数:29 
请教 关于动态链接库的问题
我的目的是制作一个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
有容就大
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
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
得分:0 
回复 3楼 hellovfp
去这么合并了下 怎么指定主次关系?


梅尚程荀
马谭杨奚







                                                       
2012-05-18 13:13
有容就大
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
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
得分:0 
理了一遍 你看下哪里不对



Test.cpp


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

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

--
DllName.h
int getAge(void);

void getIntArr(int *a,int len);

---
DllName.cpp
程序代码:
#ifdef EXPORT
    #define DLL   _declspec(dllexport)
#else
    #define DLL  _declspec(dllimport)
#endif


int _stdcall getAge(void)
{
    return 318;
}

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

--

连接DllName  后没发现产生lib文件 有DLL 和 OBJ 文件

COPY 到 TestDll 的Debug 下


然后运行TestDll工程 出现这个


去找哪里找EXE文件路径?

梅尚程荀
马谭杨奚







                                                       
2012-05-18 14:00
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
得分:0 
回复 14楼 hellovfp
应该算是导入库吧 如果是静态的那么多大的程序就太臃肿了。

梅尚程荀
马谭杨奚







                                                       
2012-05-18 14:06
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
得分:0 
把你说的那些都改了后 先提升DllName.h 无法直接打开 我就把DllName里的 .h文件复制到 TestDll下 编译后又提示

cannot open file "\开发语言\练习程序\C语言Two\HAHA\DllName\Debug\DllName.lib"
Error executing link.exe.

我也没发现有lib文件产生呢?把这句注释掉 //#pragma comment(lib, "DLLNAME.lib") 一样提升那个错误?

梅尚程荀
马谭杨奚







                                                       
2012-05-18 14:24
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
得分:0 
回复 19楼 hellovfp

这个吗?

梅尚程荀
马谭杨奚







                                                       
2012-05-18 14:29
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
得分:0 
哈哈 搞定了 原来 dll工程的源文件要带.h 汗啊

梅尚程荀
马谭杨奚







                                                       
2012-05-18 14:51
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
得分:0 
回复 24楼 hellovfp
这样看了就更明白了 现在的问题是 如果自己写的一个DLL 然后和自己写的程序放在一个空间里,用他的头文件就能使用它里面的函数了 , 那为什么VC6提供的DLL 我们只要在link设置里加上(如kernel32.lib)就不要和自己写的应用程序出现在一个空间里了。

梅尚程荀
马谭杨奚







                                                       
2012-05-18 15:51



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-367685-1-1.html




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

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