网站cn域名注册,做电影网站详细教程,北京网页设计哪家好,免费自建手机网站一、静态库#xff08;.lib#xff09;1. 静态库制作方法一#xff1a;使用Visual Studio IDE创建静态库项目#xff08;Win32 Static Library#xff09;添加源文件#xff08;.cpp#xff09;和头文件#xff08;.h#xff09;编译生成 .lib 文件方法二#xff1a;…一、静态库.lib1. 静态库制作方法一使用Visual Studio IDE创建静态库项目Win32 Static Library添加源文件.cpp和头文件.h编译生成 .lib 文件方法二使用命令行rem 编译为目标文件 cl /c mylib1.cpp mylib2.cpp rem 创建静态库 lib /OUT:mylib.lib mylib1.obj mylib2.obj2. 静态库使用代码示例mylib.h#pragma once #ifdef MYLIB_EXPORTS #define MYLIB_API __declspec(dllexport) #else #define MYLIB_API __declspec(dllimport) #endif MYLIB_API int add(int a, int b); MYLIB_API int subtract(int a, int b);main.cpp#include mylib.h #include iostream int main() { std::cout 3 5 add(3, 5) std::endl; std::cout 10 - 4 subtract(10, 4) std::endl; return 0; }编译链接rem 方法1直接链接 cl main.cpp mylib.lib rem 方法2指定库目录 cl main.cpp /I include_path /link /LIBPATH:lib_path mylib.lib二、动态库DLL1. 动态库制作方法一使用__declspec(dllexport)mydll.h#pragma once #ifdef MYDLL_EXPORTS #define MYDLL_API __declspec(dllexport) #else #define MYDLL_API __declspec(dllimport) #endif extern C MYDLL_API int multiply(int a, int b); extern C MYDLL_API double divide(double a, double b);mydll.cpp#include mydll.h BOOL APIENTRY DllMain(HMODULE hModule, DWORD reason, LPVOID lpReserved) { switch (reason) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } MYDLL_API int multiply(int a, int b) { return a * b; } MYDLL_API double divide(double a, double b) { if (b 0) return 0; return a / b; }方法二使用模块定义文件.defmydll.defLIBRARY mydll EXPORTS multiply 1 divide 2编译动态库rem 生成DLL和导入库 cl /D MYDLL_EXPORTS /LD mydll.cpp /link /DEF:mydll.def rem 或者使用 cl /D MYDLL_EXPORTS /LD mydll.cpp /Fe:mydll.dll /link /IMPLIB:mydll.lib2. 动态库使用方式方式一隐式链接最常用// main.cpp #include mydll.h #include iostream int main() { std::cout 3 * 5 multiply(3, 5) std::endl; std::cout 10 / 2 divide(10, 2) std::endl; return 0; }编译cl main.cpp mydll.lib方式二显式链接运行时加载#include windows.h #include iostream typedef int (*MultiplyFunc)(int, int); typedef double (*DivideFunc)(double, double); int main() { HINSTANCE hDll LoadLibrary(TEXT(mydll.dll)); if (!hDll) { std::cerr 无法加载DLL std::endl; return 1; } MultiplyFunc multiply (MultiplyFunc)GetProcAddress(hDll, multiply); DivideFunc divide (DivideFunc)GetProcAddress(hDll, divide); if (multiply divide) { std::cout 3 * 5 multiply(3, 5) std::endl; std::cout 10 / 2 divide(10, 2) std::endl; } FreeLibrary(hDll); return 0; }3. 使用CMake构建库CMakeLists.txt静态库cmake_minimum_required(VERSION 3.10) project(MyStaticLib) add_library(mystatic STATIC src/mylib1.cpp src/mylib2.cpp ) target_include_directories(mystatic PUBLIC include)CMakeLists.txt动态库cmake_minimum_required(VERSION 3.10) project(MyDynamicLib) add_library(mydynamic SHARED src/mydll.cpp ) target_include_directories(mydynamic PUBLIC include)三、主要区别和使用建议特性静态库 (.lib)动态库 (DLL)链接时机编译时运行时文件大小可执行文件较大可执行文件较小更新需要重新编译替换DLL即可内存使用每个程序单独加载多程序共享加载速度快相对较慢依赖管理简单需确保DLL存在四、实用技巧依赖查看使用dumpbin /exports mydll.dll查看导出函数依赖追踪使用 Dependency Walker 或dumpbin /dependents program.exe版本控制在DLL中设置版本信息.rc文件调试DLL设置调试器加载符号或在DLL项目中设置调试命令五、常见问题解决找不到DLL确保DLL在程序目录、系统目录或PATH包含的目录中导出函数名修饰使用extern C避免C名称修饰运行时错误检查DLL依赖的运行时库版本MSVCRT符号冲突使用静态库时注意全局变量和函数的命名建议根据项目需求选择小型工具或嵌入式环境 → 静态库大型系统或需要插件机制 → 动态库需要热更新功能 → 动态库 显式加载