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. jq 加载的几种方法

    jQuery加载的几种方式 //①页面加载完之前执行,与嵌入的js加载方式一样 (function ($) {     alert('start'); })(jquery); //②页面加载后执行 $ ...

  2. redis主从配置 从而实现数据备份和读写分离

    首先打开cmd,用cd找到你的redis文件夹,我的操作是 在你的第一个redis客户端文件夹配置文件中,搜索port,找到如下位置 端口号设置为6379(默认的.后面一个,两个或者多个客户端分别修改 ...

  3. 【包教包会】Chrome拓展开发实践

    首发于微信公众号<前端成长记>,写于 2019.10.18 导读 有句老话说的好,好记性不如烂笔头.人生中,总有那么些东西你愿去执笔写下. 本文旨在把整个开发的过程和遇到的问题及解决方案记 ...

  4. Comparable和Comparator 是什么以及区别

    一.Comparable和Comparator Comparable可以认为是一个内比较器,实现了Comparable接口的类,类的实例与实例直接可以比较,依赖compareTo方法的实现,compa ...

  5. Vue-CLI项目快速UI布局-element-ui

    0902自我总结 Vue-CLI项目快速UI布局-element-ui 一.element-ui的地址 https://element.eleme.cn/ 二.element-ui的安装 <!- ...

  6. drf框架serializers中ModelSerializer类简化序列化和反序列化操作

    0905自我总结 drf框架serializers中ModelSerializer类 基于seriallizer类进行简化 https://www.cnblogs.com/pythonywy/p/11 ...

  7. SpringBoot系列教程web篇之过滤器Filter使用指南扩展篇

    前面一篇博文介绍了在 SpringBoot 中使用 Filter 的两种使用方式,这里介绍另外一种直接将 Filter 当做 Spring 的 Bean 来使用的方式,并且在这种使用方式下,Filte ...

  8. R-plotly|交互式甘特图(Gantt chart)-项目管理/学习计划

    本文首发于“生信补给站”微信公众号,https://mp.weixin.qq.com/s/CGz51qOjFSJ4Wx_qOMzjiw 更多关于R语言,ggplot2绘图,生信分析的内容,敬请关注小号 ...

  9. HOOK 技术

    在介绍 截获系统消息钩子 之前,这几个函数是密切相关的: SetWindowsHookEx() 介绍: 功能:将应用程序定义的挂钩过程安装到挂钩链中. 函数原型:HHOOK SetWindowsHoo ...

  10. [HNOI2007] 理想正方形 二维ST表

    题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入输出格式 输入格式: 第一行为3个整数,分别表示a,b,n的值 第二行至 ...