`
binyan17
  • 浏览: 203598 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

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

    博客分类:
  • 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

 

分享到:
评论

相关推荐

    vs2017 C++动态链接库的创建和调用(隐式)

    vs2017 C++动态链接库的创建和调用,在VS2017下创建C++动态库(编译时去掉预编译头),把.h ,lib文件拷入新建测试工程目录下并添加到该工程中,dll文件加到运行目录下

    静态、动态链接库的创建和调用

    与静态链接库不同,动态链接库在编译链接时并不直接将库文件中的代码包含在可执行文件中,而是在运行时由操作系统负责加载。动态链接库的创建过程与静态链接库类似,只是需要在导出函数时加上特别的声明。 动态链接...

    c++ 创建动态链接库dll并调用

    本解决方案详细介绍了如何创建C++动态链接库DLL以及如何从另一个C++程序中调用其功能。以下是对整个过程的详细说明: 1. **创建DLL项目(mydll)**: - 在Visual Studio或其他C++编译环境中,新建一个Win32项目,...

    浅析C/C++中动态链接库的创建和调用

    下面为你介绍C/C++中动态链接库的创建和调用。 动态连接库的创建步骤: 创建Dll有两种方式。 一、创建Non-MFC DLL动态链接库 1、打开File —&gt; New —&gt; Project选项,选择Win32 Dynamic-Link Library —&gt;sample ...

    用devc++制作动态链接库

    通过上述步骤,我们不仅了解了如何使用Dev-C++创建动态链接库,还掌握了如何在其他项目中调用这些DLL。虽然Dev-C++并非最新版本的IDE,但对于初学者来说,它仍然是一个非常实用的学习工具。希望本文能帮助到那些希望...

    vc调用dev-c++动态链接库dll示例

    首先,我们来看标题中的关键点:“vc调用dev-c++动态链接库dll示例”。这表明我们将使用VC作为客户端应用程序,调用由Dev-C++开发并编译的DLL。Dev-C++是一款轻量级的C/C++集成开发环境,而VC则是微软提供的专业级...

    C#winform调用C++库案例,使用C++编写动态库,然后再用C#调用当前C++编写的动态库

    本案例将详细讲解如何在C# WinForms项目中调用由C++编写的动态链接库(DLL)。 首先,让我们理解动态链接库的概念。DLL是Windows操作系统中的一个重要组成部分,它允许多个程序共享同一段代码和数据,从而节省内存...

    C#调用C++的动态链接库

    总结,C#调用C++动态链接库涉及的关键知识点包括:C++ DLL的创建与导出、C调用约定、P/Invoke技术、C#中的DllImport特性以及跨语言调用的注意事项。在实际开发中,这是一项重要的技能,能够充分利用C++的性能优势和...

    C++动态链接库读写文件

    在C++编程中,动态链接库(Dynamic Link Library, DLL)是一种重要的代码共享机制,它允许多个应用程序共享同一块代码,从而节省内存并简化软件维护。动态链接库在Windows操作系统中广泛使用。本主题将深入探讨如何...

    C++动态链接库编程深入浅出

    ### C++动态链接库编程深入浅出 #### 概述 动态链接库(Dynamic Link Library,简称DLL)是在Microsoft Windows操作系统环境下的一种共享库文件格式。它允许开发者将多个应用程序所需的公共功能封装到一个单独的...

    linux环境中c++调用lua动态链接库以及编译方法

    本文将深入探讨如何在C++程序中调用Lua动态链接库,并讲解其编译过程和环境配置。 首先,我们需要理解Lua的动态链接库(liblua.so)。Lua是一个轻量级的脚本语言,它的动态链接库允许C/C++程序直接嵌入和调用Lua...

    Visual C++动态链接库

    在 Visual C++ 中,开发动态链接库需要了解一些基本概念,例如 DLL 的编制与具体的编程语言及编译器无关只要遵循约定的 DLL 接口规范和调用方式,用各种语言编写的 DLL 都可以相互调用。在 Windows 目录下的 system...

    C++动态链接库实例

    C++动态链接库通常由Visual Studio等IDE通过创建“Win32动态链接库”项目来实现。在项目中,我们需要定义接口函数,这些函数将暴露给外部应用程序调用。接口函数通常使用`extern "C"`来避免C++的名称修饰问题,确保...

    C++动态链接库实例调用

    本实例主要讲解如何在C++中调用动态链接库以实现特定的计算功能。 首先,我们需要理解动态链接库的工作原理。与静态链接库不同,动态链接库不会在编译时合并到执行文件中,而是在程序运行时按需加载。这样,DLL可以...

    动态链接库的创建和调用

    在本示例中,我们将探讨如何使用Visual Studio 2010创建一个C++动态链接库,并在VB.NET项目中调用该库中的函数。 首先,我们创建DLL项目。在VS2010中,选择“文件”&gt;“新建”&gt;“项目”,然后选择“Visual C++”&gt;...

    JNI调用C++动态链接库入门

    ### JNI调用C++动态链接库入门:详细解析与实践指南 #### 一、引言 Java Native Interface(JNI)是Java平台提供的一种强大的机制,它允许Java代码调用本地的C或C++代码,从而利用这些语言在性能、系统访问等方面...

    在LabVIEW中调用VC++生成的动态链接库文件DLL

    ### 在LabVIEW中调用VC++生成的动态链接库文件DLL #### 一、概述 在实际开发过程中,经常会遇到需要跨平台或者跨语言进行功能调用的情况。本篇文章将详细介绍如何利用LabVIEW来调用由VC++编写的动态链接库...

    C# dll的调用(动态链接库创建与使用)

    在编程世界中,动态链接库(DLL,Dynamic Link Library)是一种重要的共享代码资源,它可以被多个应用程序同时调用,以节省内存并实现代码重用。C# 作为.NET框架的一部分,同样支持创建和调用DLL。本文将深入探讨C#...

Global site tag (gtag.js) - Google Analytics