标签:http tchar .cpp 数据 常用 项目结构 proc 常见 使用外部
1、一个程序从源文件编译生成可执行文件的步骤:
预编译 --> 编译 --> 汇编 --> 链接
(1)预编译,即预处理,主要处理在源代码文件中以“#”开始的预编译指令,如宏展开、处理条件编译指令、处理#include指令等。
(2)编译过程就是把预处理完的文件进行一系列词法分析、语法分析、语义分析以及优化后生成相应的汇编代码文件。
(3)汇编是将汇编代码转变成二进制文件。
(4)链接将二进制文件链接成一个可执行的命令,主要是把分散的数据和代码收集并合成一个单一的可加载并可执行的的文件。链接可以发生在代码静态编译、程序被加载时以及程序执行时。链接过程的主要工作是符号解析和重定位。
2、库
库是一组目标文件的包,就是一些最常用的代码编译成目标文件后打包存放。而最常见的库就是运行时库(Runtime Library),如C运行库CRT.
库一般分为两种:静态库(.a 、.lib)动态库(.so 、.dll )所谓静态、动态是指链接过程。
修改myDll.h
// 下列 ifdef 块是创建使从 DLL 导出更简单的 // 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 MYDLL_EXPORTS // 符号编译的。在使用此 DLL 的 // 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将 // MYDLL_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的 // 符号视为是被导出的。 #ifdef MYDLL_EXPORTS #define MYDLL_API __declspec(dllexport) #else #define MYDLL_API __declspec(dllimport) #endif // 此类是从 myDll.dll 导出的 class __declspec(dllexport) CmyDll { public: CmyDll(void); // TODO: 在此添加您的方法。 }; extern __declspec(dllexport) int nmyDll; __declspec(dllexport) int fnmyDll(void); extern "C" __declspec(dllexport) double seekArea(int r, int h);
myDll.cpp
// myDll.cpp : 定义 DLL 应用程序的导出函数。 // #include "stdafx.h" #include "myDll.h" #include "stdio.h" // 这是导出变量的一个示例 __declspec(dllexport) int nmyDll = 0; // 这是导出函数的一个示例。 __declspec(dllexport) int fnmyDll(void) { return 42; } // 这是已导出类的构造函数。 // 有关类定义的信息,请参阅 myDll.h CmyDll::CmyDll() { return; } void show() { printf("Call the library function.\n"); printf("***************************\n"); } double area(int r) { return 3.14*r*r; } __declspec(dllexport) double seekArea(int r, int h) { show(); double under = 3.14*r*r; double v = under*h; return v; }
编译就会生成对应的dll文件,同时也会生成对应的lib文件。
注意:a.DLL中导出函数的声明有两种方式:在函数声明中加上__declspec(dllexport);采用模块定义(.def)文件声明。详见:http://www.cnblogs.com/enterBeijingThreetimes/archive/2010/08/04/1792099.html b.对于C文件创建dll时或者想使用C编译器创建dll时,建议使用 extern “C” 标志
5.DLL的隐式调用
隐式链接采用静态加载的方式,比较简单,需要.h、.lib、.dll三件套。新建“控制台应用程序”或“空项目”。配置如下:
项目->属性->配置属性->VC++ 目录-> 在“包含目录”里添加头文件testdll.h所在的目录
项目->属性->配置属性->VC++ 目录-> 在“库目录”里添加头文件testdll.lib所在的目录
项目->属性->配置属性->链接器->输入-> 在“附加依赖项”里添加“testdll.lib”(若有多个 lib 则以空格隔开)。//也可以在项目属性中设置库的链接,#pragma comment(lib, "DLLSample.lib")
项目结构:
CallMyDll.cpp
// CallmyDll.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "stdlib.h" #include "myDll.h" #pragma comment(lib, "myDll.lib") extern "C" _declspec(dllimport) double seekArea(int r, int h); int _tmain(int argc, _TCHAR* argv[]) { int r = 1, h = 5; double area = seekArea(r, h); printf("Area is:%f\n", area); system("pause"); return 0; }
#运行前:将动态库文件myDll.dll拷贝到可执行文件目录下,否则会报错。运行结果:
原文: https://blog.csdn.net/zhangfuliang123/article/details/71515796
标签:http tchar .cpp 数据 常用 项目结构 proc 常见 使用外部
原文地址:https://www.cnblogs.com/nanqiang/p/10049092.html