← 返回首页

CAA引入三方库的方法介绍※

用CAA开发过程中经常会引入一些三方的接口,比如libxl读Excel等,这里分别介绍一下静态库和动态库的引入方式。

首先介绍一下两个概念,在Windows客户端下,静态库(lib)和动态链接库(DLL)是两种不同的库文件,它们有一些关键区别:

编译时链接 vs 运行时链接:

静态库(lib):在编译时,目标程序会被链接到可执行文件中。所有库的代码和数据都会被复制到可执行文件中,使得可执行文件独立于外部库。这意味着在运行时,程序无需外部库文件。

动态链接库(DLL):在编译时,目标程序只包含对DLL的引用。实际的链接是在运行时进行的,系统在程序启动时加载DLL并将其链接到程序中。

内存占用:

静态库:可执行文件的大小较大,因为所有库的代码和数据都被包含在可执行文件中。

动态链接库:可执行文件较小,因为它只包含对DLL的引用。DLL被加载到内存中,并在需要时共享给多个应用程序,因此可以减少内存占用。

更新和维护:

静态库:如果库的更新或修改,需要重新编译和链接所有使用该库的程序。

动态链接库:如果库的更新或修改,只需要替换DLL文件。不需要重新编译和链接已经使用该DLL的程序。

可扩展性:

静态库:程序的所有部分都被打包在一起,无法在运行时替换或添加新的功能。

动态链接库:可以在不重新编译程序的情况下替换或添加DLL,提供了更大的灵活性和可扩展性。

在CAA中的使用方法:

无论是引入静态库还是动态库,我们都需要添加相关接口的头文件,由于mk编译器是通过module的makefile.mk文件组织编译过程,所以我们首先可以通过添加以下代码将头文件的目录引入进来:

LOCAL_CCFLAGS = /I "xxxxx\build\include" \

这样我们再去添加xxx\build\include下面的头文件就不需要带着路径引入,可以直接写#include"aaa.h"。然后如果我们添加lib库,可以使用以下代码添加lib库的路径和文件名:

LOCAL_LDFLAGS = /libpath:"xxx\build" \
/ERRORREPORT:PROMPT 123.lib \

如果是动态库,一方面可以通过LoadLibrary方法寻址查找dll方法,另一方面如果头文件宏定义了dllexport就可以通过宏直接引用,编译之后记得将dll放到编译环境即可。

#include <Windows.h>
// 加载动态库
HMODULE hLibrary = LoadLibrary("your_library.dll");
if (hLibrary != nullptr) {
    // 成功加载库,现在可以获取函数地址
    myFunction = (FunctionInDLL)GetProcAddress(hLibrary, "MyFunction");
    // 调用动态库中的函数
    int result = myFunction(2, 3);
    // 卸载动态库
    FreeLibrary(hLibrary);
}
// library_header.h

#ifdef LIBRARY_EXPORTS
#define LIBRARY_API __declspec(dllexport)
#else
#define LIBRARY_API __declspec(dllimport)
#endif

extern "C" {
    LIBRARY_API int MyFunction(int param1, int param2);
}
// client_code.cpp

#include <iostream>
#include "library_header.h"

int main() {
    int result = MyFunction(2, 3);
    std::cout << "Result: " << result << std::endl;
    return 0;
}

如果是动态库,总体而言,选择静态库还是动态链接库取决于项目的需求和设计考虑。静态库适用于小型项目或需要独立部署的情况,而动态链接库适用于大型项目,尤其是需要共享库和动态更新的情况。

评论