C++中动态链接库文件创建与调用

本文转自:http://bbs.51cto.com/thread-817439-1.html

做了个VC++创建动态链接库然后调用的东东 搞了一天才搞出来 我是新手在这想把我遇到的问题和新的跟大家说说 希望对新手朋友有所帮助,大侠就不用看了!!!!
开始' s$ _2 b- g7 }+ i/ u- y, @
  1.首先新建—>win32 Dynamic-link library 会有一个弹出对话框选择一个简单dll工程,建立名称:"xindedll"" P% a, e9 O5 @8 p) S/ R
  并在xindedll.cpp中输入以下代码:3 f! H) g8 w6 F
  #include "stdafx.h"
  #include "lib.h"- P/ N3 i  [8 c1 a
  int add(int x, int y)& y1 h! j# z" T. ]
  {5 L6 a' n8 ~+ t
  return x + y;( V2 G5 H, s; Z' ?0 Y7 ^
  }
  工程->增加到工程->新建->C\C++ headerfile 命名为lib 点击确定
  在lib.h中输入以下代码:
  #ifndef LIB_H
  #define LIB_H! x8 z& [+ D5 `9 J
  extern "C" int __declspec(dllexport)add(int x, int y);//使其他语言可以调用。(具体意义不知道 刚学)( C+ P# _' p! `5 t, d8 c6 l
  #endif% V* z4 N3 o  B6 g, U" \
  编译生成得到dll 和lib两个文件。
  2.新建一个win32 app工程并命名为dlldiao
  将dll和lib拷贝到dlldiao工程文件夹下,不过如下的这种形式可以不要lib文件/ d+ p5 g0 t  L0 w! ?
  1.显式调用:' X/ K; f9 i, G+ g5 l% _- _0 G
  在dllzhao.cpp中输入以下代码:* K0 B4 n1 m; N% A6 I
  #include "stdafx.h"//注意这个要在前面 要不会报错至于为什么 我也不知道,嘿嘿。3 B, A; c4 G2 P! W
  #include <stdio.h>
  #include <windows.h>4 J. [; {+ F9 R+ c- @
  typedef int(*lpAddFun)(int, int); //宏定义函数指针类型0 R1 `' s9 D4 Z/ h
  int main(int argc, char *argv[]): |. w5 Q6 q$ t' m& r' D. v
  {4 s% K* ]2 J4 e0 Q
  HINSTANCE hDll; //DLL句柄 

  lpAddFun addFun; //函数指针
  hDll = LoadLibrary("xindedll.dll");# e6 v& r# j$ @: w
  if (hDll != NULL)- t+ H9 V0 c: q% ?
  {/ r, a  I. o  e9 V$ ?
  addFun = (lpAddFun)GetProcAddress(hDll, "add");' A  A& x7 ^( U% o  G7 I: n2 X/ r
  if (addFun != NULL)
  {9 x3 A( q0 E* B) i. F
  int result;/ p" g% e6 B) `5 @1 \
  result = addFun(2, 3);* r9 b9 C7 k9 J& I- t# W
  printf("%d",result);
  ::MessageBox(NULL,"你好!","欢迎界面",MB_OK);//这句是我自己加上的是为了更好的显示下,要不程序会一闪而过,运行下你就知道。 . C0 V! }# G- Z- o
5 I' J- C  s" g4 m7 O: Q; H0 b
  }
  FreeLibrary(hDll);
  }' X" d6 N( f0 F* `) M9 A; @: ?
  return 0;. U2 o; ?  @6 u3 p! f3 w
  }
  编译生成dlldiao.exe文件 动态链接库文件要与可执行文件放在同一文件夹下!
注:在生成2的时候可能会报连接错误就是这个:8 \# [( ]- Z7 m5 V+ }& r
  LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16 , L1 q! m: D8 K' d" O9 F) }

  只需将:
  Project] --> [Settings] --> 选择"Link"属性页, 

  在Project Options中将/subsystem:windows改成/subsystem:console / Z) [7 }; o/ m8 L+ ^
1 ^0 P6 V% u0 C
如果是这个错误:. d3 ^, Q0 O+ j1 r8 b! \
libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
就这样改:; F' U$ ?8 t* m+ o- @
[Project] --> [Settings] --> 选择"Link"属性页, 
3 ], [8 e+ H7 L2 k
在Project Options中将/subsystem:console改成/subsystem:windows 

  就是这个错误让我找了好半天 感谢网上的高手们。
  希望对新手朋友们能有所帮助,共同进步,努力学习。- j7 l4 o4 i; \% l( u

2 ]! \* ~$ D" T$ \

VC++ 一些常见link错误:2 u. i! Q$ @( w7 g
最常见的例子和解释:
main or winmain函数:应该是选择工程类型的时候有错误,因为系统会根据
subsystem的选项来决定调用main或winmain作为程序的入口函数,如果是console,
会选择main, 否则如果是windows,则选择winmain。所以,如果程序没有main或者
winmain的实现部分,就会出现LNK2001.
_beginthread, _beginthreadex:程序中隐式调用多线程的东西,比如你使用MFC
的类,所以这是应该选择/MD(use multithread cpp runtime library)编译指令,否则就会出现LNK2001.
api函数:这时应该是没有link相关的Lib文件。因为dll形成的时候,静态的实现部分是放在lib文件,所以你使用函数时,系统会去找它的实现部分,如果没有,就出现
LNK2001.
自己定义的函数:那很明显,就是只声明了函数而没有实现,包括类的函数都是。, J/ S* `' q5 r5 ]


下面介绍解决的方法: * w$ u, a$ T) X/ x9 I

1. Windows子系统设置错误, 提示: 9 X( |3 t5 }, f4 R# u8 d/ w1 l
2 P- U- V/ g# m; ]3 i1 \0 t
libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main 7 ?/ V* |- ?# P: H: i

Windows项目要使用Windows子系统, 而不是Console, 可以这样设置: 8 O9 ~2 O* X- s% \5 Z

[Project] --> [Settings] --> 选择"Link"属性页, 
4 ?/ U, A; Y" W. I
在Project Options中将/subsystem:console改成/subsystem:windows 


2. Console子系统设置错误, 提示: ! P6 s6 m/ ~: z7 A4 Y6 v

LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16 6 G' |1 Y! ?9 ^

控制台项目要使用Console子系统, 而不是Windows, 设置: - }0 u% [& G- q! n8 [) d
5 V! M( @' L4 u; x' o
[Project] --> [Settings] --> 选择"Link"属性页, 
4 V1 @* p6 l" l/ g. a' P: X5 @/ W: d
在Project Options中将/subsystem:windows改成/subsystem:console 

/ v& K8 Q/ b2 }& M' _
3. 程序入口设置错误, 提示: 

msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16 + k9 N, Z+ b& Y! |  ]5 B
/ l; F1 T8 }' [# ~( t
通常, MFC项目的程序入口函数是WinMain, 如果编译项目的Unicode版本, 程序入口必须改为wWinMainCRTStartup, 所以需要重新设置程序入口: ! n9 w7 a- ?6 U4 ?& n

[Project] --> [Settings] --> 选择"Link"属性页, 2 {+ _6 n+ M* ^

在Category中选择Output, 
- F2 U6 d: |, H0 Z( _3 p! q
再在Entry-point symbol中填入wWinMainCRTStartup, 即可 1 o( Z$ C4 G! {



4. 线程运行时库设置错误, 提示: " k0 A  x0 X9 ]( k' r; @
6 l( ?: Z+ |4 q0 {+ u. P* G3 A
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex 

nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex 

这是因为MFC要使用多线程时库, 需要更改设置: 
5 s( H  @$ I  E# D6 Z9 T3 i
[Project] --> [Settings] --> 选择"C/C++"属性页, . I. C% p% ^' s  L6 |) l, x

在Category中选择Code Generation, 
0 s5 w2 d, o+ ?9 U
再在Use run-time library中选择Debug Multithreaded或者multithreaded 

其中, 
; u/ N) K* c, ^
Single-Threaded 单线程静态链接库(release版本) $ F9 S' \0 Q2 d

Multithreaded 多线程静态链接库(release版本) 2 b" {+ m- u' Q/ A% E
+ J3 j3 h6 g5 }+ N
multithreaded DLL 多线程动态链接库(release版本) $ U; W/ R# r  g( t, A" p" J

Debug Single-Threaded 单线程静态链接库(debug版本)   d, _1 O+ v7 n+ j1 ^- H  k( c5 ]1 N
+ x) U; w; j4 N9 k7 ]7 W
Debug Multithreaded 多线程静态链接库(debug版本) 
3 ^- _3 z/ f" D5 y' [7 d9 |& Z
Debug Multithreaded DLL 多线程动态链接库(debug版本) 2 Z4 J2 w: R: [4 \% X5 R9 `
2 F1 [- e7 u: O
单线程: 不需要多线程调用时, 多用在DOS环境下 

多线程: 可以并发运行 

静态库: 直接将库与程序Link, 可以脱离MFC库运行 $ ~, C- E+ W9 C6 n. I$ K

动态库: 需要相应的DLL动态库, 程序才能运行 3 O. O' ?3 z% I; O

release版本: 正式发布时使用 - ~# i, T9 @" h9 K  w$ b9 A

debug版本: 调试阶段使用' t" L4 ~3 ^: O, v" O' V
$ U/ f- v& M0 c* y1 X1 f! `4 M
在创建MFC项目时, 不使用MFC AppWizard向导, 如果没有设置好项目参数, 就会在编译时产生很多连接错误, 如error LNK2001错误, 典型的错误提示有: 

libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main 

LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16 / Q1 r3 G7 `; i1 Q2 S; g
0 e% G7 q& X: h' r7 n1 h7 }
msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16 : _! `  j3 r' B5 |0 B. Z. o% y5 e
& v& }5 X& _, T+ |
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex 7 e; i4 c3 s, [: a/ S

nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex 
4 }9 z  q" e* u, V& @3 @
————————————————————/ G7 t9 k% Z; H

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值