精华内容
下载资源
问答
  • linux lib 动态库

    千次阅读 2010-02-03 10:08:00
    动态库*.so在linux下用c和c++编程时经常会碰到,最近在网站找了几篇文章介绍动态库的编译和链接,总算搞懂了这个之前一直不太了解得东东,这里做个笔记,也为其它正为动态库链接库而苦恼的兄弟们提供一点帮助。...

    动态库*.so在linux下用c和c++编程时经常会碰到,最近在网站找了几篇文章介绍动态库的编译和链接,总算搞懂了这个之前一直不太了解得东东,这里做个笔记,也为其它正为动态库链接库而苦恼的兄弟们提供一点帮助。
    1、动态库的编译

    下面通过一个例子来介绍如何生成一个动态库。这里有一个头文件:so_test.h,三个.c文件:test_a.c、test_b.c、test_c.c,我们将这几个文件编译成一个动态库:libtest.so。

    so_test.h:

    #include <stdio.h>
    #include <stdlib.h>
    void test_a();
    void test_b();
    void test_c();

    test_a.c:

    #include "so_test.h"
    void test_a()
    {
        printf("this is in test_a.../n");
    }

    test_b.c:

    #include "so_test.h"
    void test_b()
    {
        printf("this is in test_b.../n");
    }

    test_c.c:

    #include "so_test.h"
    void test_c()
    {
        printf("this is in test_c.../n");
    }

    将这几个文件编译成一个动态库:libtest.so
    $ gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so

    2、动态库的链接

    在1、中,我们已经成功生成了一个自己的动态链接库libtest.so,下面我们通过一个程序来调用这个库里的函数。程序的源文件为:test.c。
    test.c:

    #include "so_test.h"
    int main()
    {
        test_a();
        test_b();
        test_c();
        return 0;

    }
    l         将test.c与动态库libtest.so链接生成执行文件test:
    $ gcc test.c -L. -ltest -o test

    l         测试是否动态连接,如果列出libtest.so,那么应该是连接正常了

    $ ldd test
    l         执行test,可以看到它是如何调用动态库中的函数的。
    3、编译参数解析
    最主要的是GCC命令行的一个选项:
              -shared 该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件

    l         -fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。

    l         -L.:表示要连接的库在当前目录中

    l         -ltest:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称

    l         LD_LIBRARY_PATH:这个环境变量指示动态连接器可以装载动态库的路径。

    l         当然如果有root权限的话,可以修改/etc/ld.so.conf文件,然后调用 /sbin/ldconfig来达到同样的目的,不过如果没有root权限,那么只能采用输出LD_LIBRARY_PATH的方法了。
    4、注意
           调用动态库的时候有几个问题会经常碰到,有时,明明已经将库的头文件所在目录 通过 “-I” include进来了,库所在文件通过 “-L”参数引导,并指定了“-l”的库名,但通过ldd命令察看时,就是死活找不到你指定链接的so文件,这时你要作的就是通过修改 LD_LIBRARY_PATH或者/etc/ld.so.conf文件来指定动态库的目录。通常这样做就可以解决库无法链接的问题了。

    makefile里面怎么正确的编译和连接生成.so库文件,然后又是在其他程序的makefile里面如何编译和连接才能调用这个库文件的函数????
    答:
           你需要告诉动态链接器、加载器ld.so在哪里才能找到这个共享库,可以设置环境变量把库的路径添加到库目录/lib和/usr/lib,LD_LIBRARY_PATH=$(pwd),这种方法采用命令行方法不太方便,一种替代方法
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^注释^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    LD_LIBRARY_PATH可以在 /etc/profile还是 ~/.profile还是 ./bash_profile里设置,或者.bashrc里,


    改完后运行source /etc/profile或 . /etc/profile
    更好的办法是添入/etc/ld.so.conf, 然后执行 /sbin/ldconfig

    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^注释^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    是把库路径添加到/etc/ld.so.conf,然后以root身份运行ldconfig
          也可以在连接的时候指定文件路径和名称 -I  -L.

          GCC=gcc
    CFLAGS=-Wall -ggdb -fPIC
    #CFLAGS=
    all: libfunc test
    libfunc:func.o func1.o
            $(GCC) -shared -Wl,-soname,libfunc.so.1 -o libfunc.so.1.1 $<
            ln -sf libfunc.so.1.1 libfunc.so.1
            ln -sf libfunc.so.1 libfunc.so
    ***********************************************注释************************************************
    ln -s是用来创建软链接,也就相当于windows中的快捷方式,在当前目录中创建上一级目录中的文件ttt的命名为ttt2软链接的命令是ln -s ../ttt ttt2,如果原文件也就是ttt文件删除的话,ttt2也变成了空文件。
    ln -d是用来创建硬链接,也就相当于windows中文件的副本,当原文件删除的时候,并不影响“副本”的内容。

    编译目标文件时使用gcc的-fPIC选项,产生与位置无关的代码并能被加载到任何地址:
    gcc –fPIC –g –c liberr.c –o liberr.o


    使用gcc的-shared和-soname选项;
    使用gcc的-Wl选项把参数传递给连接器ld;
    使用gcc的-l选项显示的连接C库,以保证可以得到所需的启动(startup)代码,从而避免程序在使用不同的,可能不兼容版本的C库的系统上不能启动执行。
    gcc –g –shared –Wl,-soname,liberr.so –o liberr.so.1.0.0 liberr.o –lc


    建立相应的符号连接:
    ln –s liberr.so.1.0.0 liberr.so.1;
    ln –s liberr.so.1.0.0 liberr.so;

    在MAKEFILE中:
    $@
        表示规则中的目标文件集。在模式规则中,如果有多个目标,那么,"$@"就是匹配于目标中模式定义的集合。
    $%
        仅当目标是函数库文件中,表示规则中的目标成员名。例如,如果一个目标是"foo.a(bar.o)",那么,"$%"就是"bar.o","$@"就是 "foo.a"。如果目标不是函数库文件(Unix下是[.a],Windows下是[.lib]),那么,其值为空。
    $<
        依赖目标中的第一个目标名字。如果依赖目标是以模式(即"%")定义的,那么"$<"将是符合模式的一系列的文件集。注意,其是一个一个取出来的。
    $?
        所有比目标新的依赖目标的集合。以空格分隔。
    $^
        所有的依赖目标的集合。以空格分隔。如果在依赖目标中有多个重复的,那个这个变量会去除重复的依赖目标,只保留一份。

    *********************************************注释***********************************************************************
    test: test.o libfunc
            $(GCC) -o test test.o -L. -lfunc
    %.o:%.c
            $(GCC) -c $(CFLAGS) -o $@ $<
    clean:
            rm -fr *.o
            rm -fr *.so*
            rm -fr test

    要生成.so文件,cc要带-shared 参数;要调用.so的文件,比如libfunc.so,可以在cc命令最后加上-lfunc,还要视情况加上 -L/usr/xxx 指出libfunc.so的路径;这样,在你要编译的源文件中就可以调用libfunc.so这个库文件的函数.
           前面的都说的差不多了,最后提醒一下最好提供一个接口头文件
           动态加载,用dlopen,dlclose,dlsym

    展开全文
  • Qt pro文件配置dll和lib动态库的方法

    千次阅读 2018-01-09 19:22:19
    ##################配置的相对路径############################# INCLUDEPATH += $$PWD/ffmpeg/include DEPENDPATH += $$PWD/ffmpeg/lib ##################mingw配置方式############################# ...
    #-------------------------------------------------
    #
    # Project created by QtCreator 2017-12-02T18:29:37
    #
    #-------------------------------------------------
    QT       += core gui  multimedia
    
    ##################配置库的相对路径#############################
    
    INCLUDEPATH += $$PWD/ffmpeg/include
    DEPENDPATH += $$PWD/ffmpeg/lib
    
    ##################mingw配置方式#############################
    LIBS += $$PWD/ffmpeg/lib/libavformat.dll.a
    LIBS += $$PWD/ffmpeg/lib/libavutil.dll.a
    LIBS += $$PWD/ffmpeg/lib/libavcodec.dll.a
    LIBS += $$PWD/ffmpeg/lib/libswscale.dll.a
    LIBS += $$PWD/ffmpeg/lib/libswresample.dll.a
    #LIBS += $$PWD/ffmpeg/lib/libavdevice.dll.a
    #LIBS += $$PWD/ffmpeg/lib/libavfilter.dll.a
    #LIBS += $$PWD/ffmpeg/lib/libpostproc.dll.a
    
    ##################vs配置方式#############################
    #win32: LIBS += -L$$PWD/ffmpeg/lib/ -lavcodec
    #win32: LIBS += -L$$PWD/ffmpeg/lib/ -lavdevice
    #win32: LIBS += -L$$PWD/ffmpeg/lib/ -lavfilter
    #win32: LIBS += -L$$PWD/ffmpeg/lib/ -lavformat
    #win32: LIBS += -L$$PWD/ffmpeg/lib/ -lavutil
    #win32: LIBS += -L$$PWD/ffmpeg/lib/ -lpostproc
    #win32: LIBS += -L$$PWD/ffmpeg/lib/ -lswresample
    #win32: LIBS += -L$$PWD/ffmpeg/lib/ -lswscale
    
    
    greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
    
    TARGET = XPlay
    TEMPLATE = app
    
    # The following define makes your compiler emit warnings if you use
    # any feature of Qt which as been marked as deprecated (the exact warnings
    # depend on your compiler). Please consult the documentation of the
    # deprecated API in order to know how to port your code away from it.
    DEFINES += QT_DEPRECATED_WARNINGS
    
    # You can also make your code fail to compile if you use deprecated APIs.
    # In order to do so, uncomment the following line.
    # You can also select to disable deprecated APIs only up to a certain version of Qt.
    #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
    
    
    SOURCES += \
            main.cpp \
            widget.cpp \
        xffmpeg.cpp \
        videowidget.cpp \
        xvideothread.cpp \
        xslider.cpp \
        xaudioplay.cpp
    
    HEADERS += \
            widget.h \
        xffmpeg.h \
        videowidget.h \
        xvideothread.h \
        xslider.h \
        xaudioplay.h
    
    FORMS += \
            widget.ui
    
    RESOURCES += \
        images/image.qrc
    
    RC_FILE = appicon.rc
    
    
    展开全文
  • windows lib 静态库转 dll 动态库

    千次阅读 2019-01-24 19:42:51
    lib 静态库转 dll 动态库需要有一个链接的过程,将其依赖的外部符号与对应的库链接起来,Visual Studio 中的 link 工具提供了此功能。 在 windows 的命令行下,需要先运行 vcvars64.bat 初始化编译环境,...

    本文转载自 http://zziking.github.io/windows/2019/01/22/windows_lib_link_to_dll.html

    lib 静态库转 dll 动态库需要有一个链接的过程,将其依赖的外部符号与对应的库链接起来,Visual Studio 中的 link 工具提供了此功能。

    在 windows 的命令行下,需要先运行 vcvars64.bat 初始化编译环境,才能使用 link 工具,以 Visual Studio 2017 为例, vcvars64.bat 位于 C:\Program Files(x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build 目录下,可通过以下脚本初始化编译环境:

    set INSTALLPATH=
    if exist "%programfiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" (
      for /F "tokens=* USEBACKQ" %%F in (`"%programfiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" -version 15.0 -property installationPath`) do set INSTALLPATH=%%F
    )
    echo INSTALLPATH is "%INSTALLPATH%"
    REM Save current dir for later
    pushd %CD%
    if NOT "" == "%INSTALLPATH%" (
      call "%INSTALLPATH%\VC\Auxiliary\Build\vcvars%ARCH:~-2%.bat"
    ) else (
      goto ERROR_NO_VS15
    )
    :WORK
    REM Retrieve the working dir and proceed
    popd
    echo Doing work in %CD%
    // ......
    goto END
    
    :ERROR_NO_VS15
    echo Visual Studio 2017 Tools Not Available!
    
    :END
    echo Processing ends.
    

    编译环境初始化之后,可通过以下命令来链接 lib 库,生成 dll:

    link /OUT:"xxxx.dll" /IMPLIB:"xxxx_imp.lib" /DYNAMICBASE "Ws2_32.lib" "CRYPT32.LIB" /DEBUG:FASTLINK /DLL /MACHINE:x64 /ERRORREPORT:PROMPT  /NOLOGO /LIBPATH:"依赖的第三方库的lib路径1" /LIBPATH:"依赖的第三方库的lib路径2" /DEF:"xxxx.def" xxxx.lib
    
    

    说明:

    • /OUT : 生成的 dll 路径

    • /IMPLIB : 生成的 dll 的引入库,相当于头文件,定义了相关导出函数

    • /DYNAMICBASE : 可选,静态库依赖的三方库和系统库,多个库用空格隔开

    • /MACHINE : x86 / x64

    • /LIBPATH : 可选,依赖的第三方库的查找路径

    • xxx.lib : 要链接的 lib 静态库,可多个

    • /DEF : dll 导出函数,格式如下

      LIBRARY xxxx //dll名称
      
      EXPORTS	     //导出的函数名列表
      	function1
      	function2
      	.....
      
    展开全文
  • DLL动态库LIB静态库

    2014-01-08 22:06:07
    静态链接就是你使用的.lib文件,中的代码最后需要连接到你的可执行文件中去,所以静态连接的可执行文件一般比较大一些。   2,为什么 (A)动态链接优点: 1、扩展了应用程序的特性; 2、可以用许多种编程...

    1,是什么
    动态链接库英文为DLL,是Dynamic Link Library 的缩写形式,DLL是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。
    静态链接库就是你使用的.lib文件,库中的代码最后需要连接到你的可执行文件中去,所以静态连接的可执行文件一般比较大一些。

    2,为什么
    (A)动态链接库优点:
    1、扩展了应用程序的特性;
    2、可以用许多种编程语言来编写;
    3、简化了软件项目的管理;
    4、有助于节省内存;
    5、有助于资源共享;
    6、有助于应用程序的本地化;
    7、有助于解决平台差异;
    8、可以用于一些特殊的目的。windows使得某些特性只能为DLL所用。
    (B)静态链接库优点:
    1、性能上有一定的提高:exe模块调用动态链接库的导出函数时,需要先加载动态链接库,有一定的性能损失;
    2、静态链接可以避免运行程序的系统缺少动态库而无法运行的情况

     (C)DLL、LIB的区别:

    1、存放内容

    <a> 如果只有lib文件,那么这个lib文件是静态编译出来的,包含函数的索引信息(函数入口、地址等)和函数的具体实现

    <b> 动态链接的情况下有两个文件:一个是LIB文件,一个是DLL文件。LIB包含被DLL导出的函数名和地址,DLL包含实际的函数实现,应用程序使用LIB文件链接到DLL文件。

    2、编译方式

    <a> lib的处理是在编译阶段进行的,编译器在编译时将调用者使用到的代码嵌入到调用者代码当中,与调用代码一起编译,一起在私有地址空间中分配内存。使用静态编译的lib文件,在运行程序时不需要再挂lib库,所以导致应用程序比较大,而且失去了动态库的灵活性,发布新版本时要发布新的应用程序才行。

    <b> dll的实际处理是在运行阶段进行的,编译器在编译阶段只在调用者的调用处做一个连接标记,待程序运行时再将dll装入到进程的共享地址空间中。在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中相应函数代码的地址,从而节省了内存资源。DLL和LIB文件必须随应用程序一起发行,否则应用程序会产生错误。如果不想用lib文件或者没有lib文件,可以用WIN32 API函数LoadLibrary、GetProcAddress装载。

    3调用方式

    <a> lib库在源代码中加入 #pragma comment(lib, "libname.lib")  

      具体见:http://blog.csdn.net/haojiahuo50401/article/details/7101725

     <b> dll库在win32程序中调用函数 LoadLibrary("DLLnamee.dll")  和 FreeLibrary()

    具体见: http://blog.csdn.net/haojiahuo50401/article/details/7101787 



    展开全文
  • lib静态库、dll动态库

    2016-04-24 12:41:05
    静态扩展名为.lib,静态链接(即代码会直接编译进可执行文件)。静态是一个或多个obj文件的打包。  2. 在VC中使用静态的方法:  方法一:在项目属性中添加附加依赖项。  若目录不在系统和当前...
  • 动态链接库dll 静态链接库lib 动态导入库lib 2008-12-04 16:29目前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import ...
  • 目前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import Libary,以下简称“导入库”)。 静态库是一个或者多个obj文件的打包...
  • 静态库Lib动态库Dll

    2013-02-27 11:20:54
     静态链接动态链接都是共享代码的方式,如果采用静态链接,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了。但是若使用 DLL,该 DLL 不必被包含在最终 EXE 文件中,EXE 文件...
  • .h头文件 .lib动态链接文件 .dll 动态链接 转自 http://blog.csdn.net/c395565746c/article/details/5402239 (1).h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的。 附加依赖项的是...
  • (1).h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的。 附加依赖项的是.lib 不是.dll 若生成了DLL ,则肯定也生成 LIB文件 ...如果要完成源代码的编译和链接,有...如果也使动态连接的程序运行起
  • .h头文件 .lib动态链接文件 .dll 动态链接 .h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的。 附加依赖项的是.lib不是.dll,若生成了DLL,则肯定也生成 LIB文件。如果要完成源代码的编译和...
  • dll动态库lib静态库的优劣选择。

    千次阅读 2014-02-10 23:57:46
    虽然之前研究过一些动态库的相关内容,但是以前只亲手写过使用loadlibrary调用的纯c语言的动态库,没有动态链接过c++的类,因此对dll这东西还是有些恐惧的,所以开始的时候我的工程是由几个LIB工程,几个纯C DLL工程...
  • 众所周知,出现.lib, .dll...lib文件夹里面放的都是伴随dll文件的动态lib文件; staticlib文件夹里面放的才是真正的静态lib文件,和dll文件是独立的; 所以可以看出,lib文件是有静态lib动态llib之分的。 第一...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,787
精华内容 4,314
关键字:

lib动态库