C++学习笔记12_各种文件和引入
1. 编译过程
预处理->编译->汇编->链接->.exe
预处理:
①将所有的“#define”删除,并且展开所有的宏定义
②处理所有的条件编译指令,如:“#if”、“#ifdef”、“#elif”、“#else”、“endif”等。
③处理“#include”预编译指令,将被包含的文件插入到该预编译指令的位置。
(注意:这个过程可能是递归进行的,也就是说被包含的文件可能还包含其他文件)
也就是说,预处理,主要是根据各种#,决定如何进行展开。
涉及文件.h,如果遇到#include<xxxx.h> ,那么,就在这个位置将头文件的内容展开。
这就说明,为什么有些.h文件,要比其他文件先#include了,因为根据C++的德性,没先声明的话,后面的要用到它,那么会出错。
#include<xxxx.h>是直接展开的,如果其他文件也#include<xxxx.h>,那么就展开了好多次,那么就相当于声明了好多次,那么会出错。
所以,在头文件中,要防止重复声明,要么写#pragma once,要么:
#ifndef XXX
#define XXX
//头文件中的内容
#endif
2. 各种文件的关系
.h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的。(来自网络)
.h应该不是必须的,全写到.cpp也行,但是这样的话,除非将.cpp(源码)给别人,否则别人不能用已有的代码成果。
3. . obj 文件 就是 cpp经过预编译,然后编译后的文件。
4. .dll文件-----动态链接库(DLL)
动态链接就是把调用的函数所在文件模块(DLL)和调用函数在文件中的位置等信息链接进目标程序,程序运行的时候再从DLL中寻找相应函数代码,因此需要相应DLL文件的支持。
使用 DLL,该 DLL 不必被包含在最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与 EXE 独立的 DLL 文件。
(以上来自网络)
就像C#一样,dll应该是被编译好的,在exe运行的时候,遇到要使用dll中的代码(类、函数)时,在运行目录下,从dll中翻。不用的时候,有没有都无所谓。
dll也能引用别的dll,只是要放到同一运行目录下。
5. .lib文件-----静态链接库(Lib)
.lib文件分两类:
第一类, 一般用在静态连编上,它是将LIB中的代码加入目标模块(EXE或者DLL)文件中,所以链接好了之后,LIB文件就没有用了。(来自网络)
(也就是说,此时,.lib是包含有代码的,也就是聚合了各个.obj的文件)
第二类,一种LIB是和DLL配合使用的,里面没有代码,代码在DLL中,这种LIB是用在静态调用DLL上的,所以起的作用也是链接作用,链接完成了,LIB也没用了。至于动态调用DLL的话,根本用不上LIB文件。 (来自网络)
(也就是说,DLL也是分静态调用和动态调用,动态调用,可能像C#一样,通过反射动态加载)
重点转载:https://blog.csdn.net/ljianhui/article/details/9005935 有关dll的由来,静态调用,动态调用的办法。
所以,运行软件的时候,始终不需要.lib,它仅在链接的时候需要。
那么,在C++编译出dll文件的时候,必须有lib文件作为牵线,不然其他项目想使用,也不行;相反,如果不编译出dll,有lib就足够包含代码在里面了。
根据上面的原理,看看C++如何调用mysql的库。(以下应该是静态调用)
首先建一个控制台项目:
里面stdafx.h中,#include了一些常用的头文件,类似于C#在一个新的cs文件中,默认using一些namespace差不多。
然后,就在常规中,包含附加目录。去到这个目录看一下:
全部都是头文件。
然后,在“附加包含目录”中,添加这个目录
光有.h文件还不够,前面所说,没有代码(源码或lib,或lib和dll一起),是没有用的,所以,还要“添加库目录”
(由此,可以猜测,libmysql.lib的大小只有25kb,所以应该是第二种lib,需要将libmysql.dll放进运行目录下的。而mysqlclient.lib有9000多k,属于第一类lib,已经包含了编译好的代码在里面了)
C++也够麻烦的,按常理,选择libmysql.lib文件的详细文件名地址就行了,这里还要分两步。
将这两句放进去,然后编译一下
#include <winsock.h>//这句放到前面,因为mysql.h用到winsock.h的东西
#include "mysql.h"
然后发现:
多了一大堆,很多都是“附加包含目录”映射过来的,之所以说映射,是因为从解决方案文件夹中,没有看到有拷贝过来。
也可以这样,就不用设置”附加库目录”、“附加依赖项”。
使用API的方式连接,需要加载mysql的头文件和lib文件。
在VS2010的附加包含目录中添加\MySQL\MySQL Server 5.1\include。在安装MySql的目录下找。 把libmysql.dll和libmysql.lib文件拷贝到所建的工程目录下。然后在头文件里包含以下内容:
1 //mysql所需的头文件和库文件
2 #include "winsock.h"
3 #include "mysql.h"
4 #pragma comment(lib,"libmySQL.lib")
C++学习笔记12_各种文件和引入的更多相关文章
- java之jvm学习笔记三(Class文件检验器)
java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...
- Windows phone 8 学习笔记(2) 数据文件操作
原文:Windows phone 8 学习笔记(2) 数据文件操作 Windows phone 8 应用用于数据文件存储访问的位置仅仅限于安装文件夹.本地文件夹(独立存储空间).媒体库和SD卡四个地方 ...
- thinkphp学习笔记2—入口文件
原文:thinkphp学习笔记2-入口文件 在thinkphp中有两个入口文件,一个是项目的入口文件,是index.php在主目录里面,还有一个是thinkphp框架的的入口文件,放在框架目录下面如: ...
- Java8学习笔记(八)--方法引入的补充
在Java8学习笔记(三)--方法引入中,简要总结了方法引入时的使用规则,但不够完善.这里补充下几种情况: 从形参到实例方法的实参 示例 public class Example { static L ...
- matlab学习笔记5--低级文件输入输出函数
一起来学matlab-matlab学习笔记5 低级文件输入输出函数 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab 程序设计与综合应用>张德丰等著 感谢张 ...
- [原创]java WEB学习笔记49:文件上传基础,基于表单的文件上传,使用fileuoload 组件
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- Windows phone 8 学习笔记(2) 数据文件操作(转)
Windows phone 8 应用用于数据文件存储访问的位置仅仅限于安装文件夹.本地文件夹(独立存储空间).媒体库和SD卡四个地方.本节主要讲解它们的用法以及相关限制性.另外包括本地数据库的使用方式 ...
- Python学习笔记之从文件中读取数据
10-1 Python 学习笔记:在文本编辑器中新建一个文件,写几句话来总结一下你至此学到的Python 知识,其中每一行都以“In Python you can”打头.将这个文件命名为learnin ...
- matlab学习笔记4--多媒体文件的保存和读取
一起来学matlab-matlab学习笔记4 数据导入和导出_2 多媒体文件的保存和读取 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab 程序设计与综合应用&g ...
随机推荐
- php实现商城秒杀
这一次总结和分享用Redis实现分布式锁来完成电商的秒杀功能.先扯点个人观点,之前我看了一篇博文说博客园的文章大部分都是分享代码,博文里强调说分享思路比分享代码更重要(貌似大概是这个意思,若有误请谅解 ...
- 31、vue-cli3引入封装svg图标
svg图标放大不失真,png会出现失真现象. 一.方法一 1.在对应vue项目里添加插件 vue add svg-sprite 输入 Y 2.在执行 npm install svgo svgo-loa ...
- centos7版本以上root密码破解
centos7版本以上root密码破解 主讲内容: 1.centos7版本以上root密码破解 一.centos7版本以上root密码破解 重启服务器,按键盘的方向键(上 下) 按e 进入紧急救援 ...
- 02-25 scikit-learn库之决策树
目录 scikit-learn库之决策树 一.DecisionTreeClassifier 1.1 使用场景 1.2 代码 1.3 参数详解 1.4 属性 1.5 方法 二.DecisionTreeR ...
- deferred对象和promise对象(二)---deferred对象
早上醒来,继续讨论deferred对象和primise对象. deferred对象的的方法: 1.$.Deferred()-----生成一个deferred对象 2.deferred.done()-- ...
- 用深度学习做命名实体识别(七)-CRF介绍
还记得之前介绍过的命名实体识别系列文章吗,可以从句子中提取出人名.地址.公司等实体字段,当时只是简单提到了BERT+CRF模型,BERT已经在上一篇文章中介绍过了,本文将对CRF做一个基本的介绍.本文 ...
- Android Studio:多包名打包
来自:http://m.blog.csdn.net/u011315960/article/details/73251196 前言 最近有点小忙,博客都落下了,今天赶紧写点东西补上. 前几天商务找我,想 ...
- python 安装pyqt
---恢复内容开始--- 一.安装 1.官网:www.riverbankcomputing.com 2.使用命令安装,可以自动去官网查找与Python版本号相同的程序进行下载,比较方便,如果不是这样也 ...
- 声学回声消除(Acoustic Echo Cancellation)
回声就是声音信号经过一系列反射之后,又听到了自己讲话的声音,这就是回声.一些回声是必要的,比如剧院里的音乐回声以及延迟时间较短的房间回声:而大多数回声会造成负面影响,比如在有线或者无线通信时重复听到自 ...
- call,apply和bind详解
一.call和apply call和apply其实是同一个东西,区别只有参数不同,call是apply的语法糖,所以就放在一起说了,这两个方法都是定义在函数对象的原型上的(Function.proto ...