本文转自: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