精华内容
下载资源
问答
  • 我用lua文件生成了一个lua的静态库 新建的WIN32控制台 把lua的路径和静态库位置设置后就能 正常编译并且调用lua函数成功 但是我新建 MFC_DLL项目 也按照相同的方法设置好了静态库各种包含路径 写相同的...
  • 目录 静态库 什么是静态库怎么创建 如何使用 ...静态库的第一种使用方法 ...静态库的第二种使用方法 ...怎么创建 ...隐式调用 ...静态库文件内容,通常包含一堆程序员自定的变量与函数,其内容不像动.

    目录

    静态库

    什么是静态库?

    怎么创建

    如何使用

    静态库的第一种使用方法

    静态库的第二种使用方法

     

    动态链接库

    动态库是什么?

    怎么创建

    如何使用

    隐式调用

    显式调用


    静态库

    什么是静态库?

    我们先来说一下什么是静态库,维基百科对其的解释是这样的:

    计算机科学里,静态库(英语:Static library, Statically-linked library),或称静态库,是一个外部函数与变量的集合体。静态库的文件内容,通常包含一堆程序员自定的变量与函数,其内容不像动态链接库那么复杂,在编译期间由编译器连接器将它集成至应用程序内,并制作成目标文件以及可以独立运作的可执行文件。而这个可执行文件与编译可执行文件的程序,都是一种程序的静态创建(static build)。以过去的观点来说,库只能算是静态(static)类型。

                                                                                                                                                                             ————维基百科

    对于官方的解释总是令人头大,我们可以简单地认为静态库就是一组二进制代码(.obj)的集合,然后嵌入到我们的程序经过汇编形成的二进制文件中,最终形成可执行文件。

    怎么创建

    1、我们先新建一个项目,选择win32项目

    2、在接下来的应用程序向导中选择静态库并去掉预编译头的勾。

    3、创建头文件(.h)以及源文件(.cpp),它们的格式如下:

    
        //MyLib.h
    
        #pragma once
    
        #ifndef _STATIC_LIB_H_
    
        #define _STATIC_LIB_H_
    
        #include <iostream>
    
        namespace STATIC_LIB
    
        {
    
        void PrintHello(); //测试函数
    
        }
    
        #endif
    
     
    //MyLib.cpp
    
    #include "MyLib.h"
    
    void STATIC_LIB::PrintHello()
    
    {
    
    std::cout << "Hello world!" << std::endl;
    
    }

    4、然后,我们选择release,生成解决方案(这么简单的函数应该不用调试了吧)

     

    5、随后,我们可以在自定的项目路径下的release文件夹下看到生成的lib文件。

    如何使用

    关于静态库我们有两种使用方法,我们分别来介绍一下:

    静态库的第一种使用方法

    1、我们先创建个普通的win32控制台程序,选择空项目即可。

    2、然后我们把上面创建lib时的头文件包含到新创建的控制台程序中:

    3、然后在源程序中写如下格式的代码调用即可:

    
        #include <iostream>
    
        #include "MyLib.h"
    
        #pragma comment(lib,"MyLib.lib")
    
        int main()
    
        {
    
        STATIC_LIB::PrintHello();
    
        system("pause");
    
        return 0;
    
        }

    我们对#pragma comment中的内容做些说明,它搜索的路径就是在与项目文件名同名的文件夹下,所以我们可以直接将lib文件复制到该文件夹中,当然我们也可以使用绝对路径:

    还需注意的是,刚才我们创建的lib是在release环境下创建出来的,此时调用也应在release环境下,不要出现鸡同鸭讲的情况,当然,你也可以都是在debug环境下环境下创建的。

    静态库的第二种使用方法

    1、我们创建一个include文件夹和lib文件夹用来存放头文件和lib文件:

    2、项目名那右击,选择属性,在弹出的属性页窗口中选择VC++目录,然后添加进这两个文件夹

    3、将先前创建lib时的头文件和lib文件分别复制到这两个文件夹中:

    4、接着,再在属性页面中选择链接器--输入--附加依赖项中添加我们的lib

    5、准备工作完成,在我们调用的程序中使用如下格式的代码即可调用:

    #include <iostream>
    
    #include "MyLib.h"
    
    int main()
    
    {
    
    STATIC_LIB::PrintHello();
    
    system("pause");
    
    return 0;
    
    }

    成功运行的截图:

    静态库的优点很明显,想想平时使用的标准库的优点就行了,但缺点当然也很明显,静态库是直接嵌入到可执行程序中的,会导致生成的可执行文件体积较大。当初正是为了避免此问题,才开发了动态库技术。

     

    动态链接库

    动态库是什么?

    以下是维基百科的解释:

    动态链接库(英语:Dynamic-link library,缩写为DLL)是微软公司微软视窗操作系统中实现共享函数库概念的一种实现方式。这些库函数的扩展名.DLL.OCX(包含ActiveX控制的库)或者.DRV(旧式的系统驱动程序)。所谓动态链接,就是把一些经常会共用的代码(静态链接的OBJ程序库)制作成DLL档,当可执行文件调用到DLL档内的函数时,Windows操作系统才会把DLL档加载存储器内,DLL档本身的结构就是可执行档,当程序有需求时函数才进行链接。透过动态链接方式,存储器浪费的情形将可大幅降低。静态链接库则是直接链接到可执行文件。DLL的文件格式与视窗EXE文件一样——也就是说,等同于32位视窗的可移植执行文件(PE)和16位视窗的New Executable(NE)。作为EXE格式,DLL可以包括源代码数据资源的多种组合。

                                                                                                                                                                         ————维基百科

    官方的解释就是这么高大上,粗人的理解就是相对于上面静态库,静态库是直接把代码嵌进去,而动态库则是类似独立的程序。打个比方的话就是静态库就是你留在这别走了,而动态库就是你要帮忙时叫我一下,我再来。

    怎么创建

    动态库的创建和静态库类似

    1、在win32向导中选择dll,并选择空项目创建。

    2、建立如图几个文件

    3、各个文件中的内容如下:

    
     
    //MyDll.h
    
    #pragma once
    
    #ifndef _DLL_TEST_H_
    
    #define _DLL_TEST_H_
    
    #include <iostream>
    
    namespace DLL_TEST
    
    {
    
    void PrintHello();
    
    }
    
    #endif // !_DLL_TEST_H_
    //MyDll.cpp
    
    #include "MyDll.h"
    
    void DLL_TEST::PrintHello()
    
    {
    
    std::cout << "Hello world!" << std::endl;
    
    }
    
     
    //MyDll.def
    
    LIBRARY MyDll
    
    EXPORTS
    
    PrintHello

    这里对模块定义做一些说明(最后一个文件),LIBRARY后跟的是项目名,EXPORTS后是这个dll中需要导出的函数名。

    如何使用

    动态链接库的使用方法也有两种

    隐式调用

    隐式调用就是把dll在程序运行前都先载入到内存中,然后程序运行后直接调用即可,实现方法如下:

    1、创建win32控制台空项目

    2、将上面创建Dll过程中的头文件(.h),lib文件以及dll文件复制到与项目同名的文件夹下:

    3、然后写如下格式的代码即可调用

    
     
    #include <iostream>
    
    #include "MyDll.h"
    
    #pragma comment(lib,"MyDll.lib")
    
    int main()
    
    {
    
    DLL_TEST::PrintHello();
    
    system("pause");
    
    return 0;
    
    }

    我们说明一下,这里的lib文件是用来告诉程序dll中有哪些信息而已。

    显式调用

    显示调用借助了windows库

    直接在调用程序中写如下代码即可调用:

    
     
    #include <iostream>
    
    #include <windows.h>
    
    int main()
    
    {
    
    // TODO: Add your control notification handler code here
    
    HINSTANCE hInst;
    
    hInst = LoadLibrary(L"MyDll.dll");
    
    typedef void(*Sub)();//函数指针
    
    Sub PrintHello = (Sub)GetProcAddress(hInst, "PrintHello");//从dll中加载函数出来
    
    PrintHello();//运行函数
    
    FreeLibrary(hInst); //LoadLibrary后要记得FreeLibrary
    
    system("pause");
    
    return 0;
    
    }
    

    成功运行截图:

    与隐形调用一股脑子地把所有dll加载到内存中不同,显式调用则是你要用到哪个dll就加载进来,不用了销毁了,极大地省下了空间,所以笔者推荐用第二种方法。

     

    至此,静态库和动态库的创建和使用都介绍完毕了,也感谢各位看到此的读者,希望我的努力能让你进步一点点,这就够了!

    展开全文
  • 使用virtual c++ 6.0创建和调用动态库 不得不说一下关于环境的问题 只要我打一个响指,一半的...Windows下静态库与动态库的创建与使用 尝试使用.def文件生成动态库并使用隐式链接到工程时,发现这个方法仅适用于动...

    使用virtual c++ 6.0创建和调用动态库

    不得不说一下关于环境的问题

    只要我打一个响指,一半的安装在win7上的VC6.0都会因为兼容性问题直接崩掉

    懒得研究怎么解决兼容性的问题了,直接开一个winXP虚拟机完美运行vc6.0,省时省心,岂不美哉

    研究大佬的博客的时候

    Windows下静态库与动态库的创建与使用

    尝试使用.def文件生成动态库并使用隐式链接到工程时,发现这个方法仅适用于动态库所在的工程和调用动态库的工程同时处于一个工作空间

    1073846-20180527230901128-360162433.png

    如图所示,0527helloworld是动态库所在的工程,0527testhelloworld是调用动态库的工程,两个工程都是处于名为0527helloworld的工作空间里面的

    #include "stdafx.h"
    #include "../0527helloworld/0527helloworld.h"
    
    int main(int argc, char* argv[])
    {
        int iRet;
        printf("Hello World!\n");
        iRet = cmp(3,8);
        printf("return value is: %d\n",iRet);
        return 0;
    }

    可以看到声明头文件的时候是声明了位于其他工程的头文件:#include "../0527helloworld/0527helloworld.h"

    这应该就是其他工作空间的工程就算把.dll和.lib拷到工作目录下也添加了.h文件也无法调用动态库的原因

    后来在网上找到另外一个方案,解决了这个问题

    VC++ 6.0如何创建与调用动态链接库

    现在简单介绍一下这个方案的流程

    算了,今天太晚了我要睡觉了,明天再说


    20180531更新

    关于在VirtualStudio2008生成和使用静态库的方法在网上有很多,但是很多都没有用,这一篇博客有用

    vs2008添加连接静态库和动态库


    20180601更新

    今天就把使用VC6.0创建和使用动态库的问题写成傻瓜教程,不用带着脑子,直接跟着一步一步做就可以了

    我想写一个名为SUM的求和函数,输入是两个int类型变量,输出是一个int类型变量,函数代码如下:

    int SUM(int a,int b)
    {
        return a+b;
    }

    1. 创建动态库

    1.1 新建动态库项目0601testDLLver3

    打开VC6.0,左上角菜单栏:文件->新建

    1073846-20180601185536926-68776498.png

    1073846-20180601185542222-608649101.png

    1073846-20180601185545887-950445452.png

    项目创建完成,切换到file view,可以看到一堆预生成的文件,只需要对其中三个文件进行修改

    1073846-20180601185605298-607841016.png

    1.2 修改0601testDLLver3.h文件

    // 0601testDLLver3.h : main header file for the 0601TESTDLLVER3 DLL
    //
    
    #if !defined(AFX_0601TESTDLLVER3_H__16DBBD8E_146C_4508_8E8C_20D288314FEF__INCLUDED_)
    #define AFX_0601TESTDLLVER3_H__16DBBD8E_146C_4508_8E8C_20D288314FEF__INCLUDED_
    
    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    
    #ifndef __AFXWIN_H__
        #error include 'stdafx.h' before including this file for PCH
    #endif
    
    #include "resource.h"       // main symbols
    
    /
    // CMy0601testDLLver3App
    // See 0601testDLLver3.cpp for the implementation of this class
    //
    
    class CMy0601testDLLver3App : public CWinApp
    {
    public:
        CMy0601testDLLver3App();
    
    // Overrides
        // ClassWizard generated virtual function overrides
        //{{AFX_VIRTUAL(CMy0601testDLLver3App)
        //}}AFX_VIRTUAL
    
        //{{AFX_MSG(CMy0601testDLLver3App)
            // NOTE - the ClassWizard will add and remove member functions here.
            //    DO NOT EDIT what you see in these blocks of generated code !
        //}}AFX_MSG
        DECLARE_MESSAGE_MAP()
    };
    
    extern "C" __declspec(dllexport) int __stdcall SUM(int a,int b);
    
    /
    
    //{{AFX_INSERT_LOCATION}}
    // Microsoft Visual C++ will insert additional declarations immediately before the previous line.
    
    #endif // !defined(AFX_0601TESTDLLVER3_H__16DBBD8E_146C_4508_8E8C_20D288314FEF__INCLUDED_)

    1073846-20180601185609083-453683736.png

    1.3 修改0601testDLLver3.def文件

    ; 0601testDLLver3.def : Declares the module parameters for the DLL.
    
    LIBRARY      "0601testDLLver3"
    DESCRIPTION  '0601testDLLver3 Windows Dynamic Link Library'
    
    EXPORTS
        ; Explicit exports can go here
        SUM

    1073846-20180601185614335-524194134.png

    1.4 修改0601testDLLver3.cpp文件

    // 0601testDLLver3.cpp : Defines the initialization routines for the DLL.
    //
    
    #include "stdafx.h"
    #include "0601testDLLver3.h"
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
    
    //
    //  Note!
    //
    //      If this DLL is dynamically linked against the MFC
    //      DLLs, any functions exported from this DLL which
    //      call into MFC must have the AFX_MANAGE_STATE macro
    //      added at the very beginning of the function.
    //
    //      For example:
    //
    //      extern "C" BOOL PASCAL EXPORT ExportedFunction()
    //      {
    //          AFX_MANAGE_STATE(AfxGetStaticModuleState());
    //          // normal function body here
    //      }
    //
    //      It is very important that this macro appear in each
    //      function, prior to any calls into MFC.  This means that
    //      it must appear as the first statement within the 
    //      function, even before any object variable declarations
    //      as their constructors may generate calls into the MFC
    //      DLL.
    //
    //      Please see MFC Technical Notes 33 and 58 for additional
    //      details.
    //
    
    /
    // CMy0601testDLLver3App
    
    extern "C" __declspec(dllexport) int __stdcall SUM(int a,int b)
    {
        return a+b;
    }
    
    BEGIN_MESSAGE_MAP(CMy0601testDLLver3App, CWinApp)
        //{{AFX_MSG_MAP(CMy0601testDLLver3App)
            // NOTE - the ClassWizard will add and remove mapping macros here.
            //    DO NOT EDIT what you see in these blocks of generated code!
        //}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    
    /
    // CMy0601testDLLver3App construction
    
    CMy0601testDLLver3App::CMy0601testDLLver3App()
    {
        // TODO: add construction code here,
        // Place all significant initialization in InitInstance
    }
    
    /
    // The one and only CMy0601testDLLver3App object
    
    CMy0601testDLLver3App theApp;
    
    
    
    

    1073846-20180601185621335-807103560.png

    1.5 编译代码创建动态库

    使用一阳指大力出奇迹按下f7开始编译

    生成动态库文件0601testDLLver3.lib和0601testDLLver3.dll放在0601testDLLver3工程目录下的debug文件夹中

    1073846-20180601185627511-606085361.png

    2. 使用动态库

    2.1 创建测试工程0601testDLLver4

    1073846-20180601213353482-1344576103.png

    1073846-20180601213358260-1519454613.png

    1073846-20180601213401285-1820591960.png

    项目创建完成,切换到file view,可以看到预生成的文件0601testDLLver4.cpp,除了对这个文件进行修改我们还要创建一个0601testDLLver4.h头文件

    1073846-20180601213417474-1451132958.png

    2.2 把动态库文件0601testDLLver3.lib和0601testDLLver3.dll放在0601testDLLver4工程目录下

    1073846-20180601213421144-1804084485.png

    2.3 新建0601testDLLver4.h文件

    1073846-20180601213425419-465511725.png

    1073846-20180601213428926-1484248234.png

    #include "stdafx.h"
    
    #pragma comment(lib,"0601testDLLver3.lib")
    
    extern "C" _declspec(dllimport) int _stdcall SUM(int a,int b);

    2.4 修改0601testDLLver4.cpp文件

    1073846-20180601213433317-498557794.png

    #include "stdafx.h"
    #include <stdio.h>
    #include "0601testDLLver4.h"
    
    int main(int argc, char* argv[])
    {
        printf("Hello World!\n");
        int a=1;
        int b=2;
        int c=SUM(a,b);
        printf("%d",c);
        return 0;
    }

    2.5 编译运行,万事大吉

    1073846-20180601213444630-762693574.png


    20180602更新

    使用VirtualStudio2008创建和调用静态库

    1. 创建静态库

    1.1 创建静态库项目0602RSAlib

    打开VS2008,左上角菜单栏:文件->新建

    1073846-20180602114701611-1601837870.png

    1073846-20180602114706521-25964790.png

    项目创建完成,切换到解决方案资源管理器,可以看到一些预生成的文件,只需要创建两个新文件0602RSAlib.h和0602RSAlib.cpp

    1.2 创建0602RSAlib.cpp文件

    1073846-20180602114714016-1990321921.png

    #include "stdafx.h"
    #include <stdio.h>
    
    int MessageToCipher(void)
    {
        int p,q,e,d,m,n,t,c,r;
        int x,y,z;
        char s;
        printf("请输入P和Q的值,中间用空格隔开,P和Q的值不相同且P和Q都是素数:");
        scanf("%d%d",&p,&q);
        printf("计算得到N的值为%d\n",n);
        printf("计算得到T的值为%d\n",t);
        printf("请输入E的值:");
        scanf("%d",&e);
        if(1==1)
        {
            printf("输入不合要求,请重新输入\n",t);
            scanf("%d",&e);
        }
        d=1;
        while(((e*d)%t)!=1)
        {
            d++;
        }
        printf("计算得到D的值为%d\n请输入明文M的值:",d);
        scanf("%d",&m);
        x=m;
        y=e;
        z=n;
        c=1;
        y=y+1;
        while(y!=1)
        {
            c=c*x;
            c=c%z;
            y--;
        }
        return c;
    }
    
    int CipherToMessage(void)
    {
        int p,q,e,d,m,n,t,c,r;
        int x,y,z;
        char s;
        printf("请输入P和Q的值,中间用空格隔开,P和Q的值不相同且P和Q都是素数:");
        scanf("%d%d",&p,&q);
        printf("计算得到N的值为%d\n",n);
        printf("计算得到T的值为%d\n",t);
        printf("请输入E的值:");
        scanf("%d",&e);
        if(1==1)
        {
            printf("输入不合要求,请重新输入\n",t);
            scanf("%d",&e);
        }
        d=1;
        while(((e*d)%t)!=1)
        {
            d++;
        }
        printf("计算得到D的值为%d\n请输入密文C的值:",d);
        scanf("%d",&c);
        x=c;
        y=d;
        z=n;
        m=1;
        y=y+1;
        while(y!=1)
        {
            m=m*x;
            m=m%z;
            y--;
        }
        return m;
    }
    

    1.3 创建0602RSAlib.h文件

    1073846-20180602114726970-348183859.png

    #include "stdafx.h"
    
    int MessageToCipher(void);
    int CipherToMessage(void);
    

    1.4 编译代码创建静态库

    生成静态库文件0602RSAlib.lib放0602RSAlib工程目录下的debug文件夹中

    1073846-20180602114736864-876868130.png

    另外0602RSAlib工程目录下的0602RSAlib.h待会也会用到

    1073846-20180602114742141-693012495.png

    2. 调用静态库

    2.1 创建测试工程0602testRSAlib

    1073846-20180602114748888-1137283984.png

    1073846-20180602114752964-201502607.png

    2.2 把静态库文件0602RSAlib.lib和0602RSAlib.h放在0602testRSAlib工程目录下

    1073846-20180602114758520-1942212925.png

    2.3 修改0602testRSAlib.cpp文件

    // 0602testRSAlib.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include "0602RSAlib.h"
    #include <stdio.h>
    #pragma comment(lib,"0602RSAlib.lib")
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        int temp;
        printf("非对称密码算法RSA\n");
    A:
        printf("请输入数字1或0选择进行加密运算或是解密运算:");
        scanf("%d",&temp);
        if(temp==1)
        {
            int c=MessageToCipher();
            printf("密文C的值为:%d\n",c);
            goto A;
        }
        else if(temp==0)
        {
            int m=CipherToMessage();
            printf("明文M的值为:%d\n",m);
            goto A;
        }
        else
        {
            printf("输入不合要求,请重新输入\n");
            goto A;
        }
        return 0;
    }

    2.4 编译运行,万事大吉

    1073846-20180602114808052-827114681.png

    转载于:https://www.cnblogs.com/besti20155228/p/9098026.html

    展开全文
  • 文章目录前言程序运行后调用动态库编译链接程序链接静态库生成静态库生成动态库 前言 linux下的生成的动态库和静态库没有windows下方便 linux下gcc编译默认动态链接和release 程序运行后调用动态库 动态库: ...

    前言

    linux下的生成的动态库和静态库没有windows下方便
    linux下gcc编译默认动态链接和release

    程序运行后调用动态库

    动态库:

    程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码

    可执行文件里包含的不是库,只是包含用到的函数入口地址一个表

    一个动态库链接的可执行文件仅仅包含它用到函数的入口地址的一个表,而不是外部函数所在目标文件的整个机器码

    什么加载到内存,准备运行之前

    在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接

    动态链接的好处

    动态库可以在多个程序间共享,所以动态链接库使得可执行文件更小,节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存的磁盘空间

    编译链接程序链接静态库

    静态库:

    程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不在需要静态库

    生成静态库

    1.创建四个文件

    main.c add.c sub.c sub.h add.h

    2.写好代码

    3.然后分别生成 sub.o 和 add.o

    gcc -c sub.c -o sub.o
    gcc -c add.c -o add.o

    4.将sub.o和add.o打包起来生成libmymath.a

    ar -rc libmymath.a *.o

    5.生成可执行文件a.out

    gcc main.c -L. -I. -lmymath

    生成动态库

    1.用位置无关码生成sub.o和add.o

    gcc -fPIC sub.c add.c

    2.生成动态库

    gcc -shared libmymath *.o

    3.生成可执行文件main

    gcc main.c -L. -I. -lmymath -o main

    4.此时ldd发现main找不到动态库,要修改环境变量。

    export LD_LIBRARY_PATH = $LD_LIBRARY_PATH:yourpath

    5.这个时候main找到了,完成

    动态库和静态库比较

    比较空间的占用

    静态库–在程序编译链接的时候被链接到可执行文件中
    动态库–是在程序运行之后才被加载到内存中,并且加载一个动态库可以供多个程序使用(虚拟内存机制)
    动态库节约空间

    时间效率

    静态库–被链接到可执行文件中后就不再依赖动态库了
    动态库–程序运行的时候还需要去内存中调用
    静态库节约时间

    可移植性

    静态库–可执行文件生成后就不在依赖动态库
    动态库–可执行文件生成后依然需要动态库,如果动态库没有了,程序不能正常执行。
    动态库的可移植性差

    展开全文
  • 安卓编译静态库调用

    千次阅读 2018-09-16 10:30:43
    身为一个什么都不懂的技术小白,遇到问题一通百度,神呀,终于找到了,...1、编译静态库,写个头文件,test.h #include &lt;jni.h&gt; #include &lt;stdio.h&gt; #ifndef GETSTATIC_GETMAC_H #...

    身为一个什么都不懂的技术小白,遇到问题一通百度,神呀,终于找到了,顺利编译过,燃鹅,怎么在另一个项目里调用还是不会,又是一通百度,然并卵,没有找到,最终bing里找到了,写下来万一有跟我一样的呢。

    1、编译静态库,写个头文件,test.h

    #include <jni.h>
    #include <stdio.h>
    
    #ifndef GETSTATIC_GETMAC_H
    #define GETSTATIC_GETMAC_H
    int sum();
    #endif //GETSTATIC_GETMAC_H
    

    2、写个test.cpp

    #include "test.h"
    
    int sum()
    {
        return 13;
    }

    3、CmakeList.txt,不知道为什么,总感觉这个cmake里格式难看

    cmake_minimum_required(VERSION 3.4.1)
    
    add_library(
                test        #编译后库的名字
                STATIC      #静态类型的
                src/main/cpp/test.cpp  #文件
                 )
    find_library(
                  log-lib
                  log
                  )
    target_link_libraries(
                           test  #链接的库的名字?是这个意思么
                           ${log-lib}
                           )
    
    

    4、app的build.gradle添加下面的内容

    externalNativeBuild{
        cmake{
            arguments '-DANDROID_PLATFORM=android-14',
            '-DANDROID_TOOLCHAIN=clang'
            targets 'test'   //看cmake里的名字
        }
    }

    5、make project就好了

    6、 新建一个项目,build.bradled里修改用什么版本的库

    7、cmake里修改

    cmake_minimum_required(VERSION 3.4.1)
    
    add_library(
        native-lib
        SHARED
        src/main/cpp/native-lib.cpp 
    )
    
    add_library( mytaglib       #我调用的第三方静态库,别名?
                 STATIC         #注意这里的STATIC关键词和下面的IMPORTED关键词,必须这么用
                 IMPORTED )
    set_target_properties( mytaglib  #跟上面的别名一样
                           PROPERTIES IMPORTED_LOCATION
                           ${CMAKE_SOURCE_DIR}/libs/arm64-v8a/libtest.a #库的路径
     )
    find_library(
        log-lib
        log
    )
    
    target_link_libraries(
        native-lib
        mytaglib  #跟上面的别名一样
        #Z        #为什么有这个?我也不知道,能用就行了,不深究
        ${log-lib}
       )

    8、代码里引入头文件调用就欧克了

    展开全文
  • 有时我们不想别人看见我们的源码,也需要生成静态库,那怎么生成呢?有些朋友想把plist也放到静态库中,发现不行:plist文件是资源文件,无法打进.a中。还是那句话,无论是 .a 静态库还是 .framework 静态库,最终...
  • 我在阅读commander模块的声明文件,在代码底部export导出的部分中,声明文件将一个接口导出,commander/typings/index.d.ts的代码如下 ```typescript // Type definitions for commander 2.11 // Project: ...
  • 这样,不同的当文件想用某段代码时,不用再费劲写,直接调用库文件就行了!而且,修改起来也方便,对吧!二、静态库与动态库 静态库,程序在编译时加载库文件的代码。 动态库,程序在运行时加载库文件的代码。 ...
  • iOS 生成静态库.a文件

    千次阅读 2016-09-29 22:29:10
    有时我们不想别人看见我们的源码,也需要生成静态库,那怎么生成呢? 首先,我们要创建一个CoCoa Touch Static Library工程 创建一个CoCoa Touch Static Library工程 这样我们就会得到一个.h和.m文件,我...
  • c语言怎么调用dll文件

    万次阅读 2013-03-06 15:39:09
      dll调用: (1)一般动态链接有头文件声明h文件,lib,dll;这三个文件都用;使用的时候需要引用的文件中加上#pragma comment (lib, "xxx.lib")...(2)如果只有lib,h文件,那这是静态链接,同上面一样
  • android ndk调用第三方静态链接(.a文件)在android里面我要调用客户给的一个.a(另有一个.h的头文件),我用ndk-build命令把它编译成.so的过程中一直出现问题。cmd提示如下,请问怎么解决,详细一点,各位大神...
  • 静态库与动态库

    2019-10-16 12:47:51
    是一个二进制文件中包含的是一些编译好的代码,这些代码用来实现某些特定的功能,并且这些代码可以被程序调用; 2.的分类 标准C 数学 线程等 3.怎么得到的? 是二进制文件,因为中包含的是...
  • 引用别人的静态库,或者动态库来生成新的jni调用库。我们先来看最简单的编写一个jni调用的so库,包含一个获取字符串的方法,通过这个列子,我们主要是了解怎么在android的工程中调用jni的库,以及要注意的问题。第一...
  • 学习怎么在c++中引用lua,并实现在c++中调用lua文件 工具:lua源码,vs2013 1.下载lua源码(地址:http://www.lua.org) 2.将lua源码编译成静态文件 (我这里只编译了lua链接,lua编译器和lua解释器暂时不需要...
  • VC中怎么加载静态和动态链接

    千次阅读 2014-05-24 01:54:28
    调用DLL,首先需要将DLL文件映像到用户进程的地址空间中,然后才能进行函数调用,这个函数和进程内部一般函数的调用方法相同。Windows提供了两种将DLL映像到进程地址空间的方法: 1. 隐式的加载时链接 这种方法...
  • 有时候我们需要把文件编译成让我们使用,比如我们用的libc怎么制作呢,我们一起来看一下 测试目录结构如下 在main.c中调用a.c 和b.c 中的函数,main.c内容如下: #include <stdio.h> #include "a.h...
  • 目录新建项目设置相关...之前我写了一篇名为:xcode写framework静态库脚本文件合并fat文件教程和踩坑 的文章:https://blog.csdn.net/boildoctor/article/details/112259356 但还是没说具体怎么用swift建立framework静
  • 自己要编译动态库,可是需要调用静态库,自己这块还没怎么没做过,捣鼓了两天,也终于解决了。  使用编译好的动态库的时候,老是提示未定义的 引用,问题肯定出现在了链接动态库的时候。自己要链接的是live555的...
  • vs中怎么添加外部头文件?如过直接在项目头文件处,添加一下,如下图:则,依然会报错,如下图:有两种方法,来解决:(1) 直接把外部头文件复制过来,放在此项目下即与该项目cpp文件同一目录,如下图:(2)项目...
  • 如过直接在项目头文件处,添加一下,如下图:则,依然会报错,如下图:有两种方法,来解决(你不在vs上的添加它也没事):(1) 直接把外部头文件复制过来,放在此项目下即与该项目cpp文件同一目录,如下图:(2)...
  • lib: 1.附加包含目录—添加工程的头文件目录: 项目->属性->配置属性->C/C+±>常规->...2.附加库目录—添加文件引用的lib静态库路径: 项目->属性->配置属性->链接器->...
  • 也就是当调用静态库的PE文件加载时,自动初始化,PE文件释放时,自动执行卸载 这个作用,看似不怎么样,实际运用中,处理好之后则可能省去很多麻烦的代码。 你封装在静态库中的代码,通常
  • 静态库:链接时完整地拷贝至可执行文件中,被多次使⽤用就有多份冗余拷⻉贝。动态库:链接时不复制,程序运行时由系统动态加载到内存, 供程序调用,系统只加载一次,多个程序共用,节省内存。3iOS里静态库形式?.a和....
  • 这节就来看看我们是怎么以静态方式将库和我们的程序链接起来的,另外就是我们如何自己来做库文件。   【静态库】  其实一个静态库里面有很多.o 文件,他们被打包形成了一个库文件,一般是.a 文件
  • NDK 通过java调用so文件

    2017-06-30 10:43:08
    2. 引用别人的静态库,或者动态库来生成新的jni调用库。 我们先来看最简单的编写一个jni调用的so库,包含一个获取字符串的方法,通过这个列子,我们主要是了解怎么在android的工程中调用jni的库,
  • 一、库文件怎么加载进入内存的? linux下的库有两种:静态库和共享库(动态库)。 二者的不同点在于代码被载入的时刻不同。 静态库的代码在编译过程中已经被载入可执行程序,因此体积较大。共享库的代码是在可...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 123
精华内容 49
关键字:

怎么调用静态库文件