msvc命令行编译静态库和动态库
编写一个静态库
编写要打包为静态库的函数,内容如下:
// 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命令行编译静态库和动态库相关推荐
- 如何用MSVC命令行编译 SQLite ?
作者:cuicui 这个问题的关键是如何配置MSVC 工具:VS2017 要编译的sqlite3源代码从https://www.sqlite.org/download.html下载 官方说明中的方法是 ...
- 基础IO(文件接口、安装内核源码超详细步骤图解、静态库与动态库)
基础IO C语言的文件操作接口 fopen fclose fread fwrite fseek 系统调用文件接口 open close read write lseek 安装内核源码 文件描述符&am ...
- 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 / ...
- Linux中gcc的编译、静态库和动态库的制作
欢迎大家关注笔者,你的关注是我持续更博的最大动力 Linux中gcc的编译.静态库.动态库 文章目录: 1 gcc的编译过程 1.1 gcc的编译过程 1.2 gcc的常用参数 2 gcc 静态库的制 ...
- x64 编译 静态链接_C++静态库与动态库
这次分享的宗旨是--让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择.这里不深入介绍静态库.动态库的底层格式,内存布局等,有兴趣的同学,推荐一本书<程序员的自 ...
- C程序编译过程及常见选项--静态库和动态库
C程序编译过程及常见选项--静态库和动态库 前言 一.gcc详讲 1.1 编译过程 1.2 预处理 1.3 编译(Compilation) 1.4 汇编(Assembly) 1.5 链接(Linkin ...
- 编译c语言动态库,使用gcc、g++编译C/C++源程序,静态库和动态库创建方式
后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序: 后缀为.cpp的,两者都会认为是c++程序. 注意,虽然c++是c的超集,但是两者对语法的要求是有区别的. 编译阶段,g++会调用gc ...
- gcc编译多文件项目(包含静态库和动态库)
gcc背景介绍 谈到 GCC,就不得不提 GNU 计划.GNU 全称 GNU's Not UNIX,又被称为"革奴计划",由理查德·斯托曼于 1983 年发起.GNU 计划的最终目 ...
- 动态库、静态库编译测试:含静态库链接动态库、静态库,动态库链接静态库、动态库
本文的目的是测试各种类型库的编译后的使用效果,包括库又链接其他库的编译方法,使用方法,依赖性等. 太长不看版:请跳至文章最后的总结对比表. 一.内容包含: ①静态库libbb.a依赖静态库libaa. ...
最新文章
- 1025 PAT Ranking
- js如何去除多个cookie?
- lazada开店入驻最新流程,开店只需三步
- eclipse @ 注释为何一写就报错
- [Pyhon疫情大数据分析] 一.腾讯实时数据爬取、Matplotlib和Seaborn可视化分析全国各地区、某省各城市、新增趋势
- apache配置文件详解与优化
- C++中static关键字作用总结
- 小程序 php转excel,做微信小程序上传数据 数据格式?-微信 上传数据 生成excle
- ucc编译器(中间代码生成)
- vbox虚拟机能获取到ip但是上不了网_虚拟机三种网络模式详解
- GET 和 POST 有什么区别?
- 【小程序项目开发-- 京东商城】uni-app之分类导航区域
- 苹果测试版最新发行说明,iOS 15.4支持戴口罩解锁,Dropbox和OneDrive的云存储功能被打破
- java计算机毕业设计共享充电宝管理系统源码+mysql数据库+系统+lw文档+部署
- 阿里云IoT千里传音之声连网互动营销服务,首次亮相!
- ipa上架App Store流程
- Python数据分析案例22——财经新闻可信度分析(线性回归,主成分回归,随机森林回归)
- LeetCode刷题——快慢指针
- 使用esp32cam与stm32c8t6核心板开发的99A静改动
- Jquery、Js实现网页打印,及打印样式的自定义