1,新建控制台工程xdltest,改属性-配置属性-常规-配置类型为 动态库.dll或静态库.lib
2,打开工程后添加 dltest.h, dltest.cpp,其中.h与.cpp名字没必要一样
3,编写代码
----------------------------------------------
--dltest.h
#pragma once
_declspec(dllexport) void Print(const char* str);

----------------------------------------------
--dltest.cpp
#include<iostream>
#include"dltest.h"
void Print(const char* str)
{
std::cout << "dltest>> " << str << std::endl;
}

4,编译,生成 <库的名字是根据工程名生成的>
若是静态库,则会生成 xdltest.lib.
若是动态链接库则生成 xdltest.lib 和 xdltest.dll

5,使用
(1)将xdltest.lib添加到 <属性-配置属性-链接器-输入-附加依赖项>
(2)在<属性-配置属性-链接器-常规-附加库目录>中指定xdltest.lib的目录
(3)在<属性-配置属性-c/c++-常规-附加包含目录>中指定dltest.h的目录
(4)在程序中 #include "dltest.h" 后即可使用Print("hello")输出了

下面有三种方式使用库函数
-----------------------------------------
--使用方式一
#include "stdafx.h"
#include "abc.h" //包含库的头文件

int main()
{
Print("hello,world");
return 0;
}
-----------------------------------------
--使用方式二
#include "stdafx.h"
void Print(const char* str); //声明库中的函数,使编译通过

int main()
{
Print("hello,world");
return 0;
}
-----------------------------------------
--使用方式三
#include "stdafx.h"
_declspec(dllimport) void Print(const char* str); //从库中导入进工程

int main()
{
Print("hello,world");
return 0;
}
6,运行
若是动态链接库则必须把dll文件拷到exe目录下才能运行

原理:
.h文件用于编译,使程序在语法上检测通过,利用这个原理,
可以不使用.h文件而直接将需要使用的库函数在使用前声明出来
.lib文件用于链接,若是静态链接库,直接将函数实现写入了exe中,
若是动态链接则是在exe中留下函数签名并标记它是运行时动态加载的

------------------------------------------------------------------------------------------------------

需要注意的是:

1,C#只能调用 C/C++的DLL,而不能调用lib,

2,C++生成的DLL中,函数名被改了(各编译器而不同),而C#调用C++ DLL时需要指定函数名字,因此会出错,找不到函数

对应方法是:生成C风格的DLL,它的函数是没改名字的。

C风格的DLL中函数声明加上 exterun "C",如:

exterun "C" _declspec(dllexport) void Print(const char* str);

c++动态链接库及静态链接库的生成与使用的更多相关文章

  1. Linux下动态链接库和静态链接库

    第一部分:编译过程 先了解一下linux下C代码的编译过程,C代码的编译,一般分成四个阶段,包括:预编译,编译,汇编和链接,这四个阶段的分工是 预处理过程,负责头文件展开,宏替换,条件编译的选择,删除 ...

  2. Qt 共享库(动态链接库)和静态链接库的创建及调用

    前言: 编译器 Qt Creator, 系统环境 win7 64 位 1.创建共享库: 新建文件或项目->选择 Library 和 c++ 库->选择共享库->下一步(工程名为 sh ...

  3. [转载]GCC 编译使用动态链接库和静态链接库--及先后顺序----及环境变量设置总结

    来自http://blog.csdn.net/benpaobagzb/article/details/51364005 GCC 编译使用动态链接库和静态链接库 1 库的分类 根据链接时期的不同,库又有 ...

  4. 利用GCC编译器生成动态链接库和静态链接库

    转载请标明:http://www.cnblogs.com/winifred-tang94/ 1.编译过程 gcc –fPIC –c xxx.c 其中-fPIC是通知gcc编译器产生位置独立的目标代码. ...

  5. Windows 下动态链接库和静态链接库

    1.静态链接库:就是在编译的时候把库中代码复制进工程中,导致工程变大,但是速度快. 缺点在于一套代码可能在内存中有多份拷贝,占用内存. 2.动态链接库:库由windos api加载库代码,内存中只有一 ...

  6. GCC 编译使用动态链接库和静态链接库

    1 库的分类 根据链接时期的不同,库又有静态库和动态库之分. 静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行. 有 ...

  7. GCC 编译使用动态链接库和静态链接库的方法

    1 库的分类 依据链接时期的不同,库又有静态库和动态库之分. 静态库是在链接阶段被链接的.所以生成的可执行文件就不受库的影响了.即使库被删除了,程序依旧能够成功执行. 有别于静态库,动态库的链接是在程 ...

  8. 【转】gcc 编译使用动态链接库和静态链接库

    1 库的分类 根据链接时期的不同,库又有静态库和动态库之分. 静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行. 有 ...

  9. GCC编译过程与动态链接库和静态链接库

    1. 库的介绍 库是写好的现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常. 本质上来说库是一种可执行代码的二进制形式,可 ...

随机推荐

  1. 识别TLS加密恶意流量

    利用背景流量数据(contexual flow data)识别TLS加密恶意流量 识别出加密流量中潜藏的安全威胁具有很大挑战,现已存在一些检测方法利用数据流的元数据来进行检测,包括包长度和到达间隔时间 ...

  2. SPOJ VLATTICE Visible Lattice Points 莫比乌斯反演 难度:3

    http://www.spoj.com/problems/VLATTICE/ 明显,当gcd(x,y,z)=k,k!=1时,(x,y,z)被(x/k,y/k,z/k)遮挡,所以这道题要求的是gcd(x ...

  3. 学习 Flask 扩展 Flask-RESTful

    pip install Flask-RESTful Flask-RESTful扩展.首先,我们来安装上面这个扩展. from flask import Flask from flask_restful ...

  4. git 常用命令--抓取分支-为自己记录(二)

    二:抓取分支: 多人协作时,大家都会往master分支上推送各自的修改.现在我们可以模拟另外一个同事,可以在另一台电脑上(注意要把SSH key添加到github上)或者同一台电脑上另外一个目录克隆, ...

  5. “之”字形输出二叉树 python

    “之”字形输出二叉树即第1层从左到右输出,第2层从右到左输出,第3层从左到右输出......第2*n层从右到左输出,第2*n+1层从左到右输出,如下图所示二叉树,“之”字形输出的结果为:1-3-2-4 ...

  6. Tensorflow 模型文件结构、模型中Tensor查看

    tensorflow训练后保存的模型主要包含两部分,一是网络结构的定义(网络图),二是网络结构里的参数值. 1.  .meta文件 .meta 文件以 "protocol buffer&qu ...

  7. IO综合练习--文件切割和文件合并

    有时候一个视频文件或系统文件太大了,上传和下载可能会受到限制,这时可以用文件切割器把文件按大小切分为文件碎片, 等到要使用这个文件了,再把文件碎片合并成原来的文件即可.下面的代码实现了文件切割和文件合 ...

  8. Java---SSH(MVC)面试

    Java---SSH(MVC) 1.        谈谈你mvc的理解 MVC是Model—View—Controler的简称.即模型—视图—控制器.MVC是一种设计模式,它强制性的把应用程序的输入. ...

  9. Mac下忘记mysql的root密码

    cd /usr/local/mysql/bin sudo su sudo /usr/local/mysql/support-files/mysql.server stop # ./mysqld_saf ...

  10. Oracle序列和伪表

    创建序列 create sequence sq_teacher_tnostart with 10 从哪一个数字开始increment by 1 每次增长的数字maxvalue 999999999999 ...