编写一个静态库

编写要打包为静态库的函数,内容如下:

// jclib.cpp
int func(int a, int b)
{return a + b;
}

msvc开发人员命令提示符中执行

cl /c jclib.cpp

生成jclib.obj,这是编译产生的中间文件。然后使用lib工具将其打包为静态链接库*.lib文件。

lib jclib.obj

产生jclib.lib
写个头文件声明函数,供其他模块调用。

// jclib.h
int func(int,int);

接下来写个程序调用静态库中的func函数。

// demo.cpp
#include "jclib.h"
#include <stdio.h>
#pragma comment(lib,"./jclib.lib")//这里表明要链接的库,也可以在编译选项中指定
int main()
{int a =1;int b = 3;int c = 3;printf("c=%d\n",c);c = func(a,b);//这个函数就在静态库中printf("c=%d\n",c);return 0;
}

编译链接测试例子

cl /EHsc demo.cpp

如果在demo.cpp中没有写#pragma comment语句,则执行如下编译命令

cl /EHsc demo.cpp jclib.lib

编写一个动态库

编写动态库中的函数

//jcdll.cpp
__declspec(dllexport) int add(int a, int b){return a + b;
}
__declspec(dllexport) int subtract(int a, int b){return a - b;
}

__declspec(dllexport)表示函数要导出给其他模块使用
编写动态库头文件,声明函数,供其他模块调用

// jcdll.h
int __cdecl add(int,int);
int __cdecl subtract(int,int);

编译生成动态库

cl /LD jcdll.cpp

产生jcdll.dll,jcdll.lib,jcdll.exp
编写测试程序,调用jcdll中的函数

// demo.cpp
#include "jcdll.h"
#include <stdio.h>
#pragma comment(lib,"./jcdll.lib")
int main()
{int d = 1;int e = 4;int f = add(d,e);printf("f=%d\n",f);
}

编译测试程序

cl /EHsc demo.cpp

也可使用.def文件来定义要导出的函数

; jcdll.def
; this is comment
LIBRARY jcdll.dll
EXPORTSadd          @1subtract @2

EXPORTS字段可以这样写:

func1 ;导出函数名
func2 @2 ;导出函数名和序号
func3 @3 noname  ;只导出序号

编译动态库

cl /LD /DEF: jcdll.def jcdll.cpp

注意:使用def文件定义导出函数和使用__declspec(dllexport)导出,产生的导出符号是不太一样的,使用dumpbin /exports jcdll.dll查看导出符号,发现前者导出符号和函数名完全一样,后者会被编译器打乱一点,变成?add@@YAHHH@Z?subtract@@YAHHH@Z,对于隐式链接来说无妨,编译器会处理,对于显式链接,也就是用GetProcAddress来获取函数指针时,要写?add@@YAHHH@Z才能获取到函数指针。

另外,在dll中可以定义DllMain来对dll加载和释放时进行操作。这个函数在加载dll加载和卸载时将被调用。这里就不展开了,有兴趣可以查阅其他资料。

#include <windows.h>
BOOL APIENTRY DllMain( HMODULE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved)
{switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:case DLL_THREAD_ATTACH:case DLL_THREAD_DETACH:case DLL_PROCESS_DETACH:break;}return TRUE;
}
// https://blog.csdn.net/a7055117a/article/details/47733247

显式加载dll

// 加载动态库,如果动态库没有资源文件,只有代码,就没必要用LoadLibraryEx, 用LoadLibrary就行了,参数少
// 写在这里只是记下它的用法
// 需要包含<windows.h>//HINSTANCE hDll = LoadLibrary(TEXT("jcdll.dll"));
HINSTANCE hDll = LoadLibraryEx(TEXT("jcdll.dll"), NULL, 0);
typedef int (*FUNCTYTE)(int, int); //函数指针
if (hDll != NULL)
{// 建议使用def文件定义导出函数,这样的话只要写"add"就可,不必搞这些//乱七八糟的函数名FUNCTYTE add = (FUNCTYTE)GetProcAddress(hDll, "?add@@YAHHH@Z");if (add)printf("add(1,2)=%d\n", add(1, 2));elseprintf("GetProcAddress() failed: %d\n",GetLastError());
}FreeLibrary(hDll);

msvc命令行编译静态库和动态库相关推荐

  1. 如何用MSVC命令行编译 SQLite ?

    作者:cuicui 这个问题的关键是如何配置MSVC 工具:VS2017 要编译的sqlite3源代码从https://www.sqlite.org/download.html下载 官方说明中的方法是 ...

  2. 基础IO(文件接口、安装内核源码超详细步骤图解、静态库与动态库)

    基础IO C语言的文件操作接口 fopen fclose fread fwrite fseek 系统调用文件接口 open close read write lseek 安装内核源码 文件描述符&am ...

  3. adb: createprocessw failed: 系统找不到指定的路径_gcc编译过程、gcc命令参数、静态库和动态库搜索路径...

    一.gcc编译过程 gcc -E hello.c -o hello.s //预处理 gcc -S hello.s -o hello.i //编译 gcc -c hello.i -o hello.o / ...

  4. Linux中gcc的编译、静态库和动态库的制作

    欢迎大家关注笔者,你的关注是我持续更博的最大动力 Linux中gcc的编译.静态库.动态库 文章目录: 1 gcc的编译过程 1.1 gcc的编译过程 1.2 gcc的常用参数 2 gcc 静态库的制 ...

  5. x64 编译 静态链接_C++静态库与动态库

    这次分享的宗旨是--让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择.这里不深入介绍静态库.动态库的底层格式,内存布局等,有兴趣的同学,推荐一本书<程序员的自 ...

  6. C程序编译过程及常见选项--静态库和动态库

    C程序编译过程及常见选项--静态库和动态库 前言 一.gcc详讲 1.1 编译过程 1.2 预处理 1.3 编译(Compilation) 1.4 汇编(Assembly) 1.5 链接(Linkin ...

  7. 编译c语言动态库,使用gcc、g++编译C/C++源程序,静态库和动态库创建方式

    后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序: 后缀为.cpp的,两者都会认为是c++程序. 注意,虽然c++是c的超集,但是两者对语法的要求是有区别的. 编译阶段,g++会调用gc ...

  8. gcc编译多文件项目(包含静态库和动态库)

    gcc背景介绍 谈到 GCC,就不得不提 GNU 计划.GNU 全称 GNU's Not UNIX,又被称为"革奴计划",由理查德·斯托曼于 1983 年发起.GNU 计划的最终目 ...

  9. 动态库、静态库编译测试:含静态库链接动态库、静态库,动态库链接静态库、动态库

    本文的目的是测试各种类型库的编译后的使用效果,包括库又链接其他库的编译方法,使用方法,依赖性等. 太长不看版:请跳至文章最后的总结对比表. 一.内容包含: ①静态库libbb.a依赖静态库libaa. ...

最新文章

  1. 1025 PAT Ranking
  2. js如何去除多个cookie?
  3. lazada开店入驻最新流程,开店只需三步
  4. eclipse @ 注释为何一写就报错
  5. [Pyhon疫情大数据分析] 一.腾讯实时数据爬取、Matplotlib和Seaborn可视化分析全国各地区、某省各城市、新增趋势
  6. apache配置文件详解与优化
  7. C++中static关键字作用总结
  8. 小程序 php转excel,做微信小程序上传数据 数据格式?-微信 上传数据 生成excle
  9. ucc编译器(中间代码生成)
  10. vbox虚拟机能获取到ip但是上不了网_虚拟机三种网络模式详解
  11. GET 和 POST 有什么区别?
  12. 【小程序项目开发-- 京东商城】uni-app之分类导航区域
  13. 苹果测试版最新发行说明,iOS 15.4支持戴口罩解锁,Dropbox和OneDrive的云存储功能被打破
  14. java计算机毕业设计共享充电宝管理系统源码+mysql数据库+系统+lw文档+部署
  15. 阿里云IoT千里传音之声连网互动营销服务,首次亮相!
  16. ipa上架App Store流程
  17. Python数据分析案例22——财经新闻可信度分析(线性回归,主成分回归,随机森林回归)
  18. LeetCode刷题——快慢指针
  19. 使用esp32cam与stm32c8t6核心板开发的99A静改动
  20. Jquery、Js实现网页打印,及打印样式的自定义

热门文章

  1. 【⑩MySQL】:表管理,让数据管理不再困难
  2. 测线仪正确使用方法图解2
  3. 两种CAN微控制器MCP2510与SJA1000的比较
  4. JS--JavaScript焦点处理(获取焦点focus、失去焦点blur)
  5. 企业架构建模语言ArchiMate介绍
  6. 五分钟弄懂如何使用IPv6遨游互联网
  7. 计算机组成原理存放指令,计算机组成原理 唐朔飞 习题解答
  8. 阿里云RDS导出数据库结构整理工具
  9. python进行微积分运算——sympy库简介
  10. matlab中字符串清空,matlab字符串处置(转)