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 ...
随机推荐
- [Note] 使用Code Snippet简化编码
使用NewtonSoft.Json写实体类时大量格式一致的代码出现 ,这时可以使用Code snippet来加快编码速度 [JsonProperty(PropertyName = "mess ...
- MongoDB 学习笔记之 分片和副本集混合运用
分片和副本集混合运用: 基本架构图: 搭建详细配置: 3个shard + 3个replicat set + 3个configserver + 3个Mongos shardrsname Primary ...
- 基于STM32F429和HAL库的CAN收发例程
1.CAN协议介绍 CAN 是 Controller Area Network 的缩写(以下称为 CAN),是 ISO 国际标准化的串行通信协议.在当前的汽车产业中,出于对安全性.舒适性.方便性.低公 ...
- OpenGL全流程详细解读
导语 对于开发者来说,学习OpenGL或者其他图形API都不是一件容易的事情.即使是一些对OpenGL有一些经验的开发者,往往也未必对OpenGL有完整.全面的理解.市面上的OpenGL文章往往零碎不 ...
- 算法学习之剑指offer(二)
题目1 题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. import java.util.Stack; public class Solution { ...
- postman参数化
1.新建csv文件 2.csv文件中输入变量名和参数 3.postman中新增接口,并设置变量 4.选择进入 5.导入参数化csv格式文件,点击run 查看运行结果
- .NET Core开发的iNeuOS物联网平台部署树霉派,从网关到云端整体解决方案。助力2019中国.NET峰会。
2019 中国.NET 开发者峰会正式启动 目 录 1. 概述... 2 2. 树莓派硬件配置... 2 3. 软件信息... 3 4. Raspb ...
- 洛谷P3258 [JLOI2014]松鼠的新家【LCA+树上差分】
简要题意 树上n个节点,给定路径,求每个点经过次数 题意分析 对于每两个点,有两种情况,第一种,他们的lca为本身,第二种,他们有公共祖先,又要求他们的点经过次数,暴力是不可能的,复杂度不对,所以可以 ...
- HDU 6045 Is Derek lying?
题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=6045 题目: Is Derek lying? Time Limit: 3000/1000 MS (Ja ...
- spring boot 中通过CORS实现跨域
一.跨域问题出现的原因 出现跨域问题的原因是同源策略. 同源策略 主要是三同:同协议.同域名.同端口, 同源策略目的 保证用户信息安全,防止恶意网站窃取数据.同源策略是必须的,否则cookie可以共享 ...