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_各种文件和引入的更多相关文章

  1. java之jvm学习笔记三(Class文件检验器)

    java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...

  2. Windows phone 8 学习笔记(2) 数据文件操作

    原文:Windows phone 8 学习笔记(2) 数据文件操作 Windows phone 8 应用用于数据文件存储访问的位置仅仅限于安装文件夹.本地文件夹(独立存储空间).媒体库和SD卡四个地方 ...

  3. thinkphp学习笔记2—入口文件

    原文:thinkphp学习笔记2-入口文件 在thinkphp中有两个入口文件,一个是项目的入口文件,是index.php在主目录里面,还有一个是thinkphp框架的的入口文件,放在框架目录下面如: ...

  4. Java8学习笔记(八)--方法引入的补充

    在Java8学习笔记(三)--方法引入中,简要总结了方法引入时的使用规则,但不够完善.这里补充下几种情况: 从形参到实例方法的实参 示例 public class Example { static L ...

  5. matlab学习笔记5--低级文件输入输出函数

    一起来学matlab-matlab学习笔记5 低级文件输入输出函数 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab 程序设计与综合应用>张德丰等著 感谢张 ...

  6. [原创]java WEB学习笔记49:文件上传基础,基于表单的文件上传,使用fileuoload 组件

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  7. Windows phone 8 学习笔记(2) 数据文件操作(转)

    Windows phone 8 应用用于数据文件存储访问的位置仅仅限于安装文件夹.本地文件夹(独立存储空间).媒体库和SD卡四个地方.本节主要讲解它们的用法以及相关限制性.另外包括本地数据库的使用方式 ...

  8. Python学习笔记之从文件中读取数据

    10-1 Python 学习笔记:在文本编辑器中新建一个文件,写几句话来总结一下你至此学到的Python 知识,其中每一行都以“In Python you can”打头.将这个文件命名为learnin ...

  9. matlab学习笔记4--多媒体文件的保存和读取

    一起来学matlab-matlab学习笔记4 数据导入和导出_2 多媒体文件的保存和读取 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab 程序设计与综合应用&g ...

随机推荐

  1. Docker下配置nacos

    前言 近段时间在学dubbo,dubbo-admin死活装不上,无论是本地还是docker,所以把目光投向了其他配置中心,我选定的是阿里新开源的nacos. 正文 拉取镜像到本地docker dock ...

  2. 排坑日记之批量从库IO进程停止

    早上刚睁眼,看到了一堆数据库告警的短信,其中一个内容如下: Problem started at 05:02:58 on 2019.10.12 Problem name: Slave is stopp ...

  3. Bitmap简介

    1.  BitMap Bit-map的基本思想就是用一个bit位来标记某个元素对应的Value,而Key即是该元素.由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省.(PS:划重点 ...

  4. mpvue 页面预加载,新增preLoad生命周期

    存在的必要性:mpvue开发微信小程序,在页面跳转到新页面的过程中会有200ms左右的延迟,这个200ms如果用来请求新页面的接口,那么跳转到新页面或许已经渲染好了页面. 就是两种方式: 1.新页面跳 ...

  5. A-02 梯度下降法

    目录 梯度下降法 一.梯度下降法详解 1.1 梯度 1.2 梯度下降法和梯度上升法 1.3 梯度下降 1.4 相关概念 1.4.1 步长 1.4.2 假设函数 1.4.3 目标函数 二.梯度下降法流程 ...

  6. 【TencentOS tiny】又有一个操作系统开源

    新闻 2019年9月18日,腾讯宣布将开源 自主研发的轻量级物联网实时操作系统TencentOS tiny.相比市场上其它系统,腾讯TencentOS tiny在资源占用.设备成本.功耗管理以及安全稳 ...

  7. Orecle基本概述(1)

    Orecle1.什么是orecle及体系结构?* 全局数据库,指物理磁盘数据库,一个真实存在的磁盘目录.*用户: 用户在oracle里面是用来隔离数据的*表空间: 逻辑结构,不可视的,虚拟的,用户的数 ...

  8. Python:numpy中shape和reshape的用法

    >>> w=np.zeros((5,6))>>> warray([[ 0.,  0.,  0.,  0.,  0.,  0.],       [ 0.,  0.,  ...

  9. MYSQL事件隔离级别以及复读,幻读,脏读的理解

    一.mysql事件隔离级别 1未提交读(READUNCOMMITTED) 另一个事务修改了数据,但尚未提交,而本事务中的SELECT会读到这些未被提交的数据(脏读)( 隔离级别最低,并发性能高 ) 2 ...

  10. AWD攻防工具脚本汇总(一)

    最近工作很忙 今天抽空准备下AWD比赛得攻防工具和脚本 以下只是常用 希望下周不被吊锤~~ 后续整理后想抽空写成一个攻击框架汇总放github~~ 这里从各种情景和需求中去总结工具和脚本的使用   情 ...