精华内容
下载资源
问答
  • linux默认对库的连接是使用动态库 在应用程序需要连接外部库的情况下,linux默认对库的连接是使用动态库,在找不到动态库的情况下再选择静态库。 使用方式为: gcc test.cpp -L. -ltestlib 如果当前目录有两个库...

    linux默认对库的连接是使用动态库

    在应用程序需要连接外部库的情况下,linux默认对库的连接是使用动态库,在找不到动态库的情况下再选择静态库。

    使用方式为:

    gcc test.cpp -L. -ltestlib
    

    如果当前目录有两个库libtestlib.so libtestlib.a肯定是连接libtestlib.so

    如果要指定为连接静态库则使用:

    gcc test.cpp -L. -static -ltestlib
    

    使用静态库进行连接。

    对动态库与静态库混合连接 -Wl

    当对动态库与静态库混合连接的时候,使用-static会导致所有的库都使用静态连接的方式。这时需要作用-Wl的方式:

    gcc test.cpp -L. -Wl,-Bstatic -ltestlib  -Wl,-Bdynamic -ltestdll 
    

    缺省库动态链接模式恢复

    另外还要注意系统的运行库使用动态连接的方式,所以当动态库在静态库前面连接时,必须在命令行最后使用动态连接的命令才能正常连接,如:

    gcc test.cpp -L. -Wl,-Bdynamic -ltestdll -Wl,-Bstatic -ltestlib  -Wl,-Bdynamic
    

    最后的-Wl,-Bdynamic表示将缺省库链接模式恢复成动态链接

    例子

    I have a C project that produces ten executables, all of which I would like to be linked in statically. The problem I am facing is that one of these executables uses a 3rd-party library of which only the shared-object version is available.

    If I pass the -static flag to gcc, ld will error saying it can’t find the library in question (I presume it’s looking for the .a version) and the executable will not be built. Ideally, I would like to be able to tell ‘ld’ to statically link as much as it can and fail over to the shared object library if a static library cannot be found.

    In the interium I tried something like gcc -static -lib1 -lib2 -shared -lib3rdparty foo.c -o foo.exe in hopes that ‘ld’ would statically link in lib1 and lib2 but only have a run-time dependence on lib3rdparty. Unfortunatly, this did not work as I intended; instead the -shared flag overwrote the -static flag and everything was compiled as shared-objects.

    Is statically linking an all-or-nothing deal, or is there some way I can mix and match?

    解决:

    Looking at this thread you can see that it can be done. The guys at GNU suggest

    gcc foo.c -Wl,-Bstatic -lbar -lbaz -lqux -Wl,-Bdynamic -lcorge -o foo.exe
    

    例子 2

    gcc 同时连接 静态库和动态库现在有 libmy.a & libmy.so两个库,其中的函数供main.cc调用要在可执行文件中同时连接这两个库

    试错1

    gcc -g -lstdc++ -g -L. -lmy -l ./libmy.a -o test.exe main.cc 
    

    报找不到libmy.a,可是在当前目录下已经有这个文件了

    试错2

    gcc -g -lstdc++ -g -L. -l libmy.so -l ./libmy.a -o test.exe main.cc
    

    报找不到 libmy.so,

    试错3

    在当前目录下也有这个文件用了 -static 选项,则报动态库中的函数没定义

    解决

    静态库混合动态库要加特殊指令的,:

    gcc -g -lstdc++ -g -WI,-Bdynamic -L. -lmy -WI,-Bstatic -L. -lmy -o test.exe main.cc
    

    找不到库的处理方案

    有两种方法:

    1. 可以把当前路径加入/etc/ld.so.conf中然后运行ldconfig,或者以当前路径为参数运行ldconfig(要有root权限才行)。
    2. 把当前路径加入环境变量LD_LIBRARY_PATH

    如何使用库

    gcc中关于库的参数有:

    -L 指定搜寻库的目录

      如指定当前目录` gcc -L` .
    

    -l 指定要链接的库的名称

    加入库的名称是libmylib.a,则gcc -l mylib,即去头去尾。

    –static 组织在链接时使用动态库

    –shared 生成动态库

    --static-libgcc  链接静态libgcc库
    --shared-libgcc 链接动态libgcc库
    

    可见对动态库和静态库的使用方法是一样的,同一个库如果同时存在动态库和静态库,优先链接动态库,除非使用--static强制使用静态库。

    查看库中的文件按

    注意:参数信息只能存在于 .h 头文件中
    windows下

    dumpbin   /exports   libxxx.a
    

    linux 下

    nm   -g   --defined-only   libxxx.a
    
    展开全文
  • linux cmake 动态库连接

    2016-07-29 13:33:03
    各位老师, 我在cmake脚本中用 add_subdirectory 添加多个独立的程序和库项目一起编译。但有一个动态库是其他程序依赖的,如何保证这个库项目先被编译并且其他的项目可以连接这个动态库? 多谢!
  • Visual Studio 2019 DLL动态库连接实例

    千次阅读 2019-09-06 14:59:43
    建立动态库 1.建立一个动态库项目 建立名称为mydll的动态链接库项目 项目建立完成后出现下面的项目结构 其中pch.h声明用的头文件,具体函数代码在pch.cpp文件中。dllmain.cpp和framework.h文件分别为动态...

    由于第一次使用Visual Studio 2019建立动态链接库,也是给自己留个操作笔记。如有雷同,纯属巧合!

    建立动态库

    1.建立一个动态库项目

    建立名称为mydll的动态链接库项目

    项目建立完成后出现下面的项目结构

    其中pch.h声明用的头文件,具体函数代码在pch.cpp文件中。dllmain.cpp和framework.h文件分别为动态链接库的入口和默认加载头文件,可以不用管。直接使用自动生成的代码即可。

    2.首先是在pch.h的头文件中声明要加入的函数

    extern "C" _declspec(dllexport) int Add(int a, int b);
    extern "C" _declspec(dllexport) int Sub(int a, int b);

    3.在pch.cpp中加入函数代码

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

    int Sub(int a, int b)
    {
        return a - b;
    }

    4.编译动态链接库项目,会提示[无法启动程序],在输出框有下面的结果

    建立运行动态库的控制台程序

    1.新建一个控制台应用

     

    2.添加工程的头文件目录:工程---属性---配置属性---c/c++---常规---附加包含目录:加上头文件存放目录。

    3.添加文件引用的lib静态库路径:工程---属性---配置属性---链接器---常规---附加库目录:加上lib文件存放目录。

    4.添加工程引用的lib文件名:工程---属性---配置属性---链接器---输入---附加依赖项:加上lib文件名。

    5.把生成的dll放到工程的可执行EXE文件所在的目录下

    6.在主函数中增加DLL头文件的引用及对应的调用代码

    #include "pch.h"

    #pragma comment (lib,"mydll_03.lib")
    extern "C" _declspec(dllimport) int Add(int a, int b);
    extern "C" _declspec(dllimport) int Sub(int a, int b);

    7.直接使用DLL中的函数

    8.编译及结果

    展开全文
  • Linux ldconfig 查看动态库连接

    千次阅读 2016-07-19 20:48:24
    /usr/lib64/tls: (hwcap: 0x8000000000000000) [root@wx02 ~]# ldconfig -v | grep keep libzookeeper_mt.so.2 -> libzookeeper_mt.so.2.0.0 libzookeeper_st.so.2 -> libzookeeper_st.so.2.0.0
    /usr/lib64/tls: (hwcap: 0x8000000000000000)
    [root@wx02 ~]# ldconfig -v | grep keep
    	libzookeeper_mt.so.2 -> libzookeeper_mt.so.2.0.0
    	libzookeeper_st.so.2 -> libzookeeper_st.so.2.0.0

    展开全文
  • 1、找不到文件的原因 文件不存在 这种情况一般是因为所需要的包没装,只要安装相应的包就可以解决存在而系统不知道 这种情况一般出现在自己编译软件时候 确保文件所在的路径已加入系统,在/etc/ld.so....

    1、找不到库文件的原因

    • 库文件不存在 这种情况一般是因为所需要的包没装,只要安装相应的包就可以解决
    • 存在而系统不知道 这种情况一般出现在自己编译软件时候 确保库文件所在的路径已加入系统,在/etc/ld.so.conf文件中设置 用命令ldconfig更新数据库

    在编译一些开源软件的时候常常会遇到类似于error while loading shared libraries: libmysqlclient.so 等链接接库找不到。那怎么办呢?
    总的来说是由于开源软件的动态链接库没有放在程序寻找的地方,尤其是连个开源软件相互协作运行的时候,例如mysql+php,mysql+sphinx。
    那这样怎么办呢?
    先来看看linux寻找动态链接库的顺序吧!
    1.编译目标代码时指定的动态库搜索路径;
    2.环境变量LD_LIBRARY_PATH指定的动态库搜索路径;
    3.配置文件/etc/ld.so.conf中指定的动态库搜索路径;
    4.默认的动态库搜索路径/lib;
    5.默认的动态库搜索路径/usr/lib。
    如果出现没有寻找到动态链接库的是时候,我们可以根据以上五个步骤去尝试解决。
    1.在编译原代码的时候
    ./configure --help 查看一下是不是可以在编辑的时候指定lib目录和include目录
    2.可以通过export将LD_LIBRARY_PATH指定为你需要搜索的路径。
    3.如果要通过第三种方式去修改那么
    vi /etc/ld.so.conf
    在此文件中写入你需要用的动态链接库的位置
    例如mysql就是/usr/local/mysql/lib/mysql
    然后
    ldconfig
    4.在您所需要装的软件中寻找到那个动态链接库,放入到目录/lib和/usr/lib

    2、x86_64 linux 查看可执行文件动态链接库相关信息

    [fjwr@cin ~]$ uname -a
    Linux cin 2.6.18-238.el5 #1 SMP Sun Dec 19 14:22:44 EST 2010 x86_64 x86_64 x86_64 GNU/Linux

     

    ldd <可执行文件名>       查看可执行文件链接了哪些  系统动态链接库
    nm <可执行文件名>       查看可执行文件里面有哪些符号
    strip <可执行文件名>      去除符号表可以给可执行文件瘦身
    如果我们想从可执行程序里面提取出来一点什么文本信息的话,还可以用strings命令
    strings <可执行文件名>


    Linux操作系统上面的动态共享库大致分为三类:

    1、操作系统级别的共享库和基础的系统工具库

    比方说libc.so, libz.so, libpthread.so等等,这些系统库会被放在/lib和/usr/lib目录下面,如果是64位操作系统,还会有/lib64和/usr /lib64目录。如果操作系统带有图形界面,那么还会有/usr/X11R6/lib目录,如果是64位操作系统,还有/usr/X11R6 /lib64目录。此外还可能有其他特定Linux版本的系统库目录。

    这些系统库文件的完整和版本的正确,确保了Linux上面各种程序能够正常的运行。

    2、应用程序级别的系统共享库

    并非操作系统自带,但是可能被很多应用程序所共享的库,一般会被放在/usr/local/lib和/usr/local/lib64这两个目录下 面。很多你自行编译安装的程序都会在编译的时候自动把/usr/local/lib加入gcc的-L参数,而在运行的时候自动到/usr/local /lib下面去寻找共享库。

    以上两类的动态共享库,应用程序会自动寻找到他们,并不需要你额外的设置和担心。这是为什么呢? 因为以上这些目录默认就被加入到动态链接程序的搜索路径里面了。Linux的系统共享库搜索路径定义在/etc/ld.so.conf这个配置文件里面。 这个文件的内容格式大致如下:


    /usr/X11R6/lib64  
    /usr/X11R6/lib  
    /usr/local/lib  
    /lib64  
    /lib  
    /usr/lib64  
    /usr/lib  
    /usr/local/lib64  
    /usr/local/ImageMagick/lib

    假设我们自己编译安装的ImageMagick图形库在/usr/local/ImageMagick目录下面,并且希望其他应用程序都可以使用 ImageMagick的动态共享库,那么我们只需要把/usr/local/ImageMagick/lib目录加入/etc/ld.so.conf文 件里面,然后执行:ldconfig 命令即可。

    ldcofig将搜索以上所有的目录,为共享库建立一个缓存文件/etc/ld.so.cache。为了确认ldconfig已经搜索到ImageMagick的库,我们可以用上面介绍的strings命令从ld.so.cache里面抽取文本信息来检查一下:

    strings /etc/ld.so.cache | grep ImageMagick  


    输出结果为:

    /usr/local/ImageMagick/lib/libWand.so.10  
    /usr/local/ImageMagick/lib/libWand.so  
    /usr/local/ImageMagick/lib/libMagick.so.10  
    /usr/local/ImageMagick/lib/libMagick.so  
    /usr/local/ImageMagick/lib/libMagick++.so.10  
    /usr/local/ImageMagick/lib/libMagick++.so
    已经成功了!

    3、应用程序独享的动态共享库

    有很多共享库只被特定的应用程序使用,那么就没有必要加入系统库路径,以免应用程序的共享库之间发生版本冲突。因此Linux还可以通过设置环境变 量LD_LIBRARY_PATH来临时指定应用程序的共享库搜索路径,就像我们上面举的那个例子一样,我们可以在应用程序的启动脚本里面预先设置 LD_LIBRARY_PATH,指定本应用程序附加的共享库搜索路径,从而让应用程序找到它。

    转自:http://blog.sina.com.cn/s/blog_87fad56a01012lw3.html

    展开全文
  • 光谱仪连接动态库

    2018-10-23 21:16:16
    光谱仪连接动态库。 光谱仪连接动态库。光谱仪连接动态库
  • 动态库与静态库的区别,各自的优缺点,动态库和静态库的创建方法与连接方法
  • 动态连接库 linux

    2010-05-18 10:00:23
    基本的动态连接库 的编写。基础入门。实践。编写动态连接库
  • C++ 动态连接库实例

    2013-04-27 13:17:26
    动态链接实例,知识点 动态链接的使用方法,动态连接库的编写函数
  • 将多个静态库链接为一个动态库,提供统一的接口给外部使用。 看一下例子的目录文件: 编译后将生成 libAdd.a libMutiply.a , 然后将这两个.a静态库和apl_myApi.o 链接成为一个动态库 libMyApi.so。提供这个动态库...
  • Linux下动态共享 连接和加载路径

    千次阅读 2014-02-19 22:05:27
    1. 连接时找不到某一个函数,出现“ xxxxx undefined”,应该就是连接时找不到相应的动态库连接动态库的路径如下: 1> 默认路径是:/lib, /usr/lib/, /usr/local/lib 2> -L: 指定连接动态库的路径 ...
  • 动态连接库psapi.dll

    热门讨论 2011-10-14 12:04:48
    win7 无法定位到程序输入点 getprocessimagefilenamew 于动态连接库psapi.dll
  • qt 写的使用动态连接库的方法,一个小demo,含有详细注释
  • 本文的目的是测试各种类型库的编译后的使用效果,包括库又链接其他库的编译方法,使用方法,依赖性等。 太长不看版:请跳至文章最后的总结对比表。...④动态库libbb.so依赖动态库libaa.so的测试; ...
  • C# WinForm 应用程序的 SQL Server 连接配置界面 动态库 博文地址:http://blog.csdn.net/fengyan19822008/archive/2009/12/03/4929961.aspx
  • 在一次偶然的机会中,查看公司(公司用的是unix aix编译器xlc)库代码在看到Makefile 时,发现其后面对生成的动态库进行了软连接的操作。{ 这边插入一个知识点,在unxi,aix,xlc编译器生成动态库和静态库的方法:...
  • gcc同时连接静态和动态库

    千次阅读 2016-12-06 17:58:10
    GCC默认的选项,在连接连接库时,默认的采用动态连接。如果采用静态连接需要添加-static参数,但是这个参数对整个GCC连接命令同时有效,即指定的全部采用静态连接的方式。 如何同时同时使用动态和静态链接,在...
  • Android NDK生成及连接静态库与动态库

    千次阅读 2016-10-23 11:46:21
    对于Android应用开发,大部分情况下我们使用Java就能完整地实现一个应用。但是在某些情况下,我们需要借助C/C++来写JNI本地代码。...而应用开发者如何去连接这些生成的静态库或动态库。由于现在Android Studio
  • gcc 混合连接动态库和静态库

    千次阅读 2013-08-14 14:23:58
    我记得静态库混合动态库要加特殊指令的,你可以试试这样: gcc -g -lstdc++ -g -WI,-Bdynamic -L. -lmy -WI,-Bstatic -L. -lmy -o test.exe main.cc
  • linux静态库,动态库和硬链接,软连接 标签:  杂谈 分类: linux/unix 静态库 1、命令gcc -c a.c b.c生成a.o和b.o; 2、命令ar -r libname.a a.o b.o生成包含名为libname.a的静态库; 3、命令...
  • C#调用动态连接库-----

    2008-12-03 22:54:54
    C#调用动态连接库C#调用动态连接库C#调用动态连接库
  • c++调用matlab生成的Dll动态连接库
  • QT下生成动态库并链接动态库

    千次阅读 2019-05-21 13:33:17
    QT下生成动态库并链接 请测有效 Qt下生成动态库,参考文章: https://www.cnblogs.com/boright88/p/6263137.html Qt下链接动态库,参考文章: https://blog.csdn.net/yanmanm/article/details/82704651 1、 qt下生成...
  • 我用makefile可以编译通过,但运行出错 error while loading shared libraries: libavformat.so.57: cannot ...然后 ldd 查看依赖动态库,显示找不到。。。 我的动态库都在本目录下 再然后搞了很久,之前...
  • Linux下静态库和动态库的编译连接

    千次阅读 2012-05-18 14:48:45
    http://blog.sina.com.cn/s/blog_4090ba590100t3nu.html .a文件  gcc -c test.c  ar rc libtest.a test.o  ranlib libtest.a     ...动态库或共享库
  • Linux 静态链接动态连接库

    千次阅读 2016-02-15 13:49:23
    下面给出实例代码演示Linux下面静态链接动态链接的区别:静态链接动态链接都是共享代码的方式,如果采用静态链接,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了。...
  • vs生成动态库及使用动态库

    千次阅读 2017-05-25 21:51:30
    动态库(.dll):动态库又称动态链接库英文为DLL,是Dynamic Link Library 的缩写形式,DLL是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可...
  • Linux动态库依赖其它动态库的问题

    千次阅读 2019-11-15 11:17:45
    1 前言 这两天在编写一个插件系统Demo的...这个报错翻译过来就是没有在命令行中指定该动态库。 这个报错就很搞事了,你说你明明知道需要哪个库,为什么不直接帮我链接呢,非得我显示的在命令行中指定呢? 2 现象描...
  • VS2010 中编写动态库和调用动态库

    千次阅读 2018-11-12 23:05:42
    ... VS2010 中编写动态库和调用动态库 百度查了一下在VS中编写动态库的方法,亲测有效。 (1)启动VS2010》文件》新建》项目,按下图进行选择填写,选择Win32控制台应...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 384,009
精华内容 153,603
关键字:

动态库链接