精华内容
下载资源
问答
  • C++| 调用静态库

    千次阅读 2019-03-07 01:08:28
    1.创建Windows控制台应用程序 2.将Lib库和头文件拷贝到调用目录下 将创建好的静态库,拷贝到工程目录下。...5.调用静态库成功 如下图所示,上述准备工作完成后,就可以使用静态库中的函数了,至此静态库调用...

    1.创建Windows控制台应用程序

    2.将Lib库和头文件拷贝到调用目录下

    3.插入静态库头文件

    • 静态库的头文件作为接口,是一个API。

    4.链接Lib库

    • 右击项目,点击属性

    • 点击链接器,输入,附加依赖项,编辑

    • 把静态库添加进去

    5.调用静态库成功

    如下图所示,上述准备工作完成后,就可以使用静态库中的函数了,至此静态库调用成功。

    6.替代步骤4,链接静态库lib的方式

    如下图中的语句:#pragma comment(lib,"MyLib.lib"),可以替代手动链接lib文件。

    展开全文
  • Linux下C调用静态库和动态库

    千次阅读 2016-11-23 16:29:04
    Linux下C调用静态库和动态库本文主要介绍Linux下C调用静态库和动态库,使用的样例文件请点击这里. 样例文件welcome.c:#include #include"welcome.h"void welcome() { printf("welcome to my code world!\n"); } 这...

    Linux下C调用静态库和动态库

    本文主要介绍Linux下C调用静态库和动态库,使用的样例文件请点击这里.

    样例文件

    welcome.c:

    #include<stdio.h>
    #include"welcome.h"
    
    void welcome()
    {
        printf("welcome to my code world!\n");
    }

    这是一个样例程序,打印一句话.

    welcome.h:

    #ifndef _WELCOME_H
    #define _WELCOME_H
    
    void welcome();
    
    #endif

    为上一个文件的声明.

    概念

    动态库和静态库二者的不同点在于代码被载入的时刻不同。

    静态库的代码在编译过程中已经被载入可执行程序,因此体积比较大。动态库(共享库)的代码在可执行程序运行时才载入内存,在编译过程中仅简单的引用,因此代码体积比较小。

    静态情况下,把库直接加载到程序中,而动态库链接的时候,它只是保留接口,将动态库与程序代码独立,这样就可以提高代码的可复用度,和降低程序的耦合度。

    静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在.

    静态库

    生成静态库文件:

    $ gcc -Wall -O2 -fPIC -I./  -c -o welcome.o welcome.c
    $ ar crv libwelcome.a welcome.o

    ar命令的参数如下:

    参数        意义
    -r      将objfile文件插入静态库尾或者替换静态库中同名文件
    -x      从静态库文件中抽取文件objfile
    -t      打印静态库的成员文件列表
    -d      从静态库中删除文件objfile
    -s      重置静态库文件索引
    -v      创建文件冗余信息
    -c      创建静态库文件

    test-sta.c:

    #include<stdio.h>
    
    int main(void)
    {
        welcome();
    
        return 0;
    }

    编译:

    $ gcc test-sta.c -o test-sta ./libwelcome.a

    运行:

    $ ./test-sta 
    $ welcome to my code world!

    动态库

    生成动态库文件:

    $ gcc -o2 -fPIC -shared welcome.c -o libwelcome.so
    or
    $ gcc -o2 -fPIC -c welcome.c 
    $ gcc -shared -o libwelcome.so welcome.o 

    其中:
    - fPIC : 产生与位置无关代码,全部使用相对地址.
    - shared : 生成动态库.

    编译时加载(隐式)

    test-implicit.c:

    #include<stdio.h>
    
    int main()
    {
        welcome();
    
        return 0;
    }

    和静态库一样,测试代码不需要包含导出函数的头文件.

    编译:

    $ gcc -o2 -Wall -L. -lwelcome test-implicit.c -o test-implicit

    查看test-implicit动态段信息,发现已经依赖libwelcome.so:

    $ ldd test-implicit 
        linux-vdso.so.1 =>  (0x00007f0902951000)
        libwelcome.so => ./libwelcome.so (0x00007f090274f000)
        libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x0000003548600000)
        libm.so.6 => /lib64/libm.so.6 (0x000000353de00000)
        libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x0000003548200000)
        libc.so.6 => /lib64/libc.so.6 (0x000000353da00000)
        /lib64/ld-linux-x86-64.so.2 (0x000000353d600000)

    若此时直接运行,会提示找不到动态库:

    $ ./test-implicit
    $ ./test-implicit: error while loading shared libraries: libwelcome.so: cannot open shared object file: No such file or directory

    可以通过下列三种方法解决:

    # 方法一 修改环境变量
    $ export LD_LIBRARY_PATH=$(pwd):$LD_LIBRARY_PATH
    
    # 方法二 将库文件链接到系统目录下
    $ ln -s ./libwelcome.so /usr/lib
    
    # 方法三 修改/etc/ld.so.conf
    $ sudo echo $(pwd) >> /etc/ld.so.conf
    $ sudo ldconfig

    再次运行:

    $ ./test-implicit
    $ welcome to my code world!

    运行时链接(显式)

    test-explicit.c:

    #include<stdio.h>
    #include<dlfcn.h>
    
    #define LIB "./libwelcome.so"
    
    int main(void)
    {
        /*
         * RTLD_NOW:将共享库中的所有函数加载到内存 
         * RTLD_LAZY:会推后共享库中的函数的加载操作,直到调用dlsym()时方加载某函数
         */
    
        void *dl = dlopen(LIB,RTLD_LAZY); //打开动态库
    
        if (dl == NULL)
            fprintf(stderr,"Error:failed to load libary.\n");
    
        char *error = dlerror(); //检测错误
        if (error != NULL)
        {
            fprintf(stderr,"%s\n",error);
            return -1;
        }
    
        void (*func)() = dlsym(dl,"welcome"); // 获取函数地址
        error = dlerror(); //检测错误
        if (error != NULL)
        {
            fprintf(stderr,"%s\n",error);
            return -1;
        }
    
        func(); //调用动态库中的函数
    
        dlclose(dl); //关闭动态库
        error = dlerror(); //检测错误
        if (error != NULL)
        {
            fprintf(stderr,"%s\n",error);
            return -1;
        }
    
        return 0;
    }

    编译:

    $ gcc  -ldl test-explicit.c -o test-explicit

    查看test-explicit动态段信息,没有发现依赖libwelcome.so:

    $ ldd test-explicit
        linux-vdso.so.1 =>  (0x00007ffed89e5000)
        libdl.so.2 => /lib64/libdl.so.2 (0x000000353e600000)
        libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x0000003548600000)
        libm.so.6 => /lib64/libm.so.6 (0x000000353de00000)
        libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x0000003548200000)
        libc.so.6 => /lib64/libc.so.6 (0x000000353da00000)
        /lib64/ld-linux-x86-64.so.2 (0x000000353d600000)

    运行:

    $ ./test-explicit
    $ welcome to my code world!

    区别: 隐式调用在编译可执行程序时需要指定库文件的搜索路径,而显式调用编译可执行程序时不用加上.

    Reference

    About me

    forthebadge
    - GitHub:AnSwErYWJ
    - Blog:http://www.answerywj.com
    - Email:yuanweijie1993@gmail.com
    - Weibo:@AnSwEr不是答案
    - CSDN:AnSwEr不是答案的专栏

    Creative Commons License This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.
    本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。

    展开全文
  • 解压后资源里有两个文件,一个C++_lib,为在vs2015下制作lib的工程;另外一个为test,是调用lib的工程
  • 静态库调用其它静态库

    千次阅读 2019-12-24 12:19:22
    编译静态库时只有编译过程,没有链接过程,静态库引用其它库并不会在编译的时候把引用的库函数编译到生成的lib中,只是简单的将编译后的中间文件打包,在编译最终的可执行项目(.exe和.dll)的时候,需要引用所有的...

    在我们封装底层库的时候,有时会想能不能把底层的库直接打包进我们的库里,之前也一直有这样的疑问,最近终于把这个问题搞清楚了,如下:

    编译静态库时只有编译过程,没有链接过程,静态库引用其它库并不会在编译的时候把引用的库函数编译到生成的 lib 中,只是简单的将编译后的中间文件打包,在编译最终的可执行项目(.exe 和 .dll)的时候,需要引用所有的库,进行符号消解。如果你需要封装,使用动态库。

    在使用库的时候,经常会遇到如下问题:

    1. 出现无法定义的符号错误
        这表明链接阶段找不到函数的定义,在dependlib.lib中没有导出你需要的函数;最简单的测试方法是将dependlib做成动态链接库,用depends查看导出的函数。我怀疑是在导出函数时没有加上 extern “C” 标记,由于C++符号表的原因导出函数不是原函数
    2. 同时引用depend1.lib和depend2.lib
        因为depend1.lib在编译阶段已经将depend2.lib所有函数编译到静态库的地址空间,因此原来在depend2.lib库中的所有函数在depend1.lib库中都有一份定义,在调用其中任何一个库里的函数时,链接阶段都会出现函数重复定义的编译错误

    那是不是我们就没有办法将底层库打包呢?答案还是有的,如下:

    唯一的方法是使用librarian / archiver工具(例如Linux上的ar)通过链接多个库来创建一个新的静态库。

    在Linux或MingW上,使用GNU工具链:

    ar -M <<EOM
        CREATE libab.a
        ADDLIB liba.a
        ADDLIB libb.a
        SAVE
        END
    EOM
    ranlib libab.a

    如果你不删除liba.alibb.a,你可以做一个“瘦档案”:

    ar crsT libab.a liba.a libb.a

    在Windows上,使用MSVC工具链:

    lib.exe /OUT:libab.lib liba.lib libb.lib

     

    展开全文
  • Qt静态库的生成及调用
  • windows开发环境goLand开发工具调用gcc、g++编译生成的静态库文件 使用gcc对.cpp文件编译生成.o文件、g++对.c文件编译生成.o文件 执行命令ar -crsv libhello.a *.o生成.a静态库文件
  • makefile如何调用静态库

    千次阅读 2020-04-07 20:57:56
    makefile如何调用静态库 1、在windows下 g++环境中,调用一个python的静态链接库,在makefile文件有一段是全局的g++命令: $(PROG): $(OBJS) $(CXX) $(LFLAGS) $^ -o $@ 现在我要链接上一个python的静态库,lib...

    makefile如何调用静态库

    1、在windows下 g++环境中,调用一个python的静态链接库,在makefile文件有一段是全局的g++命令:

    $(PROG): $(OBJS)
    	 $(CXX) $(LFLAGS) $^ -o $@
    

    现在我要链接上一个python的静态库,lib存储在makefile同目录下libs文件夹下:

    $(PROG): $(OBJS)
    	 $(CXX) $(LFLAGS) $^ -o $@  ./libs/libpython37.a
    

    2、在Linux Ubuntu 18.04版本中添加静态库,视python版本而定:

    $(PROG): $(OBJS)
    	 $(CXX) $(LFLAGS) $^ -o $@ -lpython3.6m
    
    展开全文
  • Android 如何调用第三方静态库 文件

    千次阅读 2017-07-04 22:54:58
    Android 如何调用第三方静态库 文件
  • c语言读取mat文件调用静态库,包含libmatio.lib、hdf5.lib、szip.lib、zlib1.lib
  • c++如何调用lib文件 静态库文件

    千次阅读 2016-07-27 15:58:53
    在VC++目录中,包含目录与目录分别填写上lib头文件所在的位置以及lib文件所在的位置,链接器输入里填写入libdemo.lib #include #include using namespace std; int main() { mylib libproc; libproc....
  • MAKEFILE(静态库,动态库,可执行文件)模板,照着填写就可以了,很方便,用UE或记事本打开后编辑
  • 一、现象:QT中调用VS生成的DLL动态库成功,但调用静态lib库失败,通常提示xxx.a文件未找到 二、原因:首先dll动态库与lib静态库区别在于,调用前者时只是跳转到dll中函数入口地址,函数的具体内容在编译时并不加载...
  • Vs2017调用静态库的详细方法

    千次阅读 2018-11-01 15:06:38
    Vs2017调用静态库的详细方法 步骤1 打开vs2017,新建一个项目。 新建一个静态库项目,点击完成。 步骤2 分别添加头文件testlib.h,和cpp文件testlib.cpp 编辑testlib.h文件如图: 编辑testlib.cpp...
  • Jni中执行ndk-build,编译第三方静态库(.a)和动态库(.so)的Android.mk文件写法,这是Jni测试引用第三方静态库和动态库demo
  • MFC应用程序调用静态库lib

    千次阅读 2017-09-21 15:14:58
    MFC应用程序调用静态库
  • 调用静态库生成动态库并使用

    千次阅读 2018-09-27 14:56:08
    最近研究了一下动态库和静态库调用的问题,本篇文字是在生成动态库的时候调用静态库,并使用动态库编译成可执行程序。不足之处还望多多指教。 1、首先写了一个简单的接口编译成静态库(.h文件和.cpp文件如下) //...
  • QT 动态库和静态库的实现和调用

    千次阅读 2018-05-23 12:34:55
    QT 动态库和静态库的实现和调用一、简述 加强某一部分代码的保密性,将其打包成动态库或静态库;或者是调用其他开源的库文件。二、效果三、工程结构四、源文件...
  • 静态库的创建与调用

    千次阅读 2019-04-15 18:04:27
    静态库的创建: 静态库后缀通常以.a结尾,链接生成静态库时需要使用ar命令。 常用参数: r 在库中插入(修改)模块(替换静态库)。当插入的模块名已经在库中存在, 则替换同名的模块,如若干模块中有一个模块...
  • 在文件夹下面创建一个main.c的文件 代码都是标准代码 #include int main() {  printf("Hello, World!\n");  return 0;  } 没什么特别的 2. 编译和运行 命令行转到TestX目录 cd /Users/lidong/Desktop/Tes
  • GCC生成及调用动态库和静态库

    千次阅读 2018-03-28 21:14:27
    说明:本文全部使用的cpp文件,如果要编译C库请将g++替换为gcc文件:reply.h,reply.cpp,test.cpp,主函数在test.cpp中(一)静态库的生成及使用1.生成.o目标文件g++ -c reply.cpp2.使用ar命令打包ar crv libreply.a reply...
  • 我创建了一个c++静态库(比如a.lib),然后想引用到另一个项目b中去,这个项目如果设置同样生成静态库,就正常编译后生成b.lib,但是我需要的是动态库(b.dll),然而当我将属性页...难道动态库不能引用静态库文件吗?
  • Linux+qt生成和调用静态库

    千次阅读 2016-05-25 10:28:04
    简单的生成和调用静态库,根据百度的例子很快试验成功,如果生成的静态库包含静态库则需要注意下,在调用静态库时要包含。 生成静态库: 1、文件-新建文件和项目-library--c++库--choose,类型选择静态链接库,修改...
  • LINUX下动态库调用静态库的方法

    千次阅读 2016-03-18 14:04:55
    LINUX下动态库调用静态库的方法 有这样一种情形,在创建一个动态库的同时,可能会调用一个静态库,这个静态库可能是你自己写的,也可能是第三方的。比如有下面五个文件,生成一个静态库,一个动态库,一个执行文件...
  • C语言调用C++静态库

    千次阅读 2016-05-10 13:10:39
    生成C++静态库 hello.h文件 #ifndef HELLO_H #define HELLO_H#ifdef __cplusplus extern "C"{ #endif void hello(void); #ifdef __cplusplus }; #endifhello.cpp文件#include #include "hello.h" void hello() { ...
  • 安卓编译静态库调用

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

    千次阅读 2019-10-24 15:49:52
    so 动态库文件和静态库文件区别 在Linux操作系统中,普遍使用ELF格式作为可执行程序或者程序生成过程中的中间格式。ELF(Executable and Linking Format,可执行连接格式)。 ELF文件分类 ELF文件格式包括三种主要...
  • 系统1:ThinkPad T570、Windows10、QT5.12.2(Qt Creater 4.8.2) 1.在qtcreater中按如下步骤创建动态,动态...在工程中自动生成的mydll.pro文件里内容如下: #--------------------------------------------...
  • 解决方案一:在VS2017中点击项目-》右键-》属性-》配置属性-》链接器-》输入-》附加依赖项:将相关的lib文件加入到附加依赖项中; 解决方案二:我们调用的函数或者类型并未实现;此时我们只要自己建立对应的源文件...
  • 最近在帮助项目的大神测试编译出来的安卓动态,需要用到jni,但是使用ndk去编译有太麻烦(还是懒),毕竟太多了。然后以前听说android studio被谷歌搞得可以使用cmake 去编译源码,于是乎,就更新了许久未用的...
  • Qt5.9下调用.a静态库的方法,跟平常调用.dll文件的用法完全一模一样,前提是这个编译出的.a静态库,一定要使用Qt5.9的gcc编译器,最好是用mingw编译出来的.a文件,否则十分有可能,出现不兼容导致编译出错,也就是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 316,131
精华内容 126,452
关键字:

怎么调用静态库文件