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. java架构之路-(SpringMVC篇)SpringMVC主要流程源码解析(下)注解配置,统一错误处理和拦截器

    我们上次大致说完了执行流程,也只是说了大致的过程,还有中间会出错的情况我们来处理一下. 统一异常处理 比如我们的运行时异常的500错误.我们来自定义一个类 package com.springmvcb ...

  2. yum install php-gd 安装php gd库报错Error: php56w-common conflicts with php-common-5.3.3-48.el6_8.x86_64 大

    yum install php-gd安装php gd库报错Error: php56w-common conflicts with php-common-5.3.3-48.el6_8.x86_64大概的 ...

  3. 前端深入之css篇|link和@import到底有什么区别?

    写在前面 在真正的前端开发中,我们很少去写行内样式和内嵌样式,通常都是去引用外部样式. 而在我们学习之初的外部样式表都是用link引入的,但是当后来我们学习的逐渐深入,发现@import也可以引入样式 ...

  4. JavaScript 面向对象编程 · 理解对象

    前言:      在我们深入 面向对象编程之前 ,让我们先理解一下Javascript的 对象(Object),我们可以把ECMAScript对象想象成散列表,其值无非就是一组名值对,其中值可以是数据 ...

  5. ping通谷歌后发送QQ邮件通知

    前言   国庆期间,据说是为了防止有人在重大节日发表不正当言论,很多可以kxsw的ip都被封了,可是什么时候才会解封呢,不能没事就去ping一下吧,所以我写了个定时任务,定时ping谷歌服务器,如果p ...

  6. Django2.0入门:第一章、Django是啥

    Django介绍 缘起 随着Python语言的兴起,越来越多的程序员开始转向这门语言的学习.在我们学习完Python基础之后,就可以选择利用Python这门语言进行Web应用开发.而众多Python ...

  7. 【WPF】EntityframeworkCore NLog出力设置

    最近在用EFcore,由于不熟悉,经常出现一些异常都不知道如何排查,只能把EFcore的执行记录打印出来调查.确实简化了很多问题的调查. 官网提供了Asp.net Core与.net core 应用的 ...

  8. 大神都在用的yum源

    本文原创首发于公众号:编程三分钟 yum 命令的使用 yum命令天天都在用,都快用烂了,但是很多人不知道为什么只要联网,yum命令就能像老奶奶手中的魔法棒一样,随心所欲的下载到想到的包. 比如你想装个 ...

  9. 服务器时间误差导致的google sign-in后台验证错误(远程调试java程序)

    https://developers.google.com/identity/sign-in/web/backend-auth import com.google.api.client.googlea ...

  10. 【NOIP模拟赛】小奇挖矿 2

    [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿石交易市场,以便为飞船升级无限非概率引擎. [问题描述] 现在有m+1个星球,从左到右标号为0到m,小奇最初在0 ...