首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么GNU链接器找不到-l <library>的共享对象?

GNU链接器找不到-l <library>的共享对象的原因可能有以下几种:

  1. 库文件路径不正确:当使用-l <library>选项时,链接器会在默认的库文件路径中查找共享对象。如果库文件不在默认路径中,链接器就会找不到共享对象。解决方法是通过-L选项指定库文件的路径,或者将库文件放在默认路径中。
  2. 库文件不存在:如果指定的共享对象不存在,链接器就会找不到。解决方法是确保库文件存在,并且路径正确。
  3. 库文件命名不正确:链接器会根据-l <library>选项指定的库名来查找共享对象。如果库文件命名不正确,链接器就会找不到。解决方法是确保库文件命名正确,并且与-l选项指定的库名一致。
  4. 库文件没有正确安装:如果库文件没有正确安装,链接器就会找不到。解决方法是重新安装库文件,并确保安装路径正确。

需要注意的是,以上解决方法是一般性的建议,具体情况可能因操作系统、编译环境等因素而异。在实际使用中,可以根据具体情况进行调试和解决。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

详解共享动态加载

编译和链接动态可执行文件 首先,我们将为main.cpp创建一个共享对象: $ clang++ -o main.o -c main.cpp 与之前完全相同random.o。...可以静态地执行此操作-并将random库中所有符号直接加载到main可执行文件中。 我们告诉编译我们要使用librandom文件。由于它是动态加载为什么我们在编译时需要它?...因此,我们需要让我们clang知道在哪里搜索共享库。我们用-L参数来做到这一点。请注意,由指定路径-L仅在链接时影响搜索路径,而不会在运行时影响。...好, 我们已经知道main依赖于librandom.so, 那么,为什么在运行时main找不到librandom.so ? 运行时搜索路径 ldd是一个工具,使我们可以查看递归共享依赖关系。...难怪找不到我们共享库-所在目录librandom.so不在搜索路径中!解决此问题最特别的方法是使用LD_LIBRARY_PATH: $ LD_LIBRARY_PATH=. .

3.1K20

gcc基本命令_cmake 命令

介绍 GCC(英文全拼:GNU Compiler Collection)是 GNU 工具链主要组成部分,是一套以 GPL 和 LGPL 许可证发布程序语言编译自由软件,由 Richard Stallman...-c :编译和汇编,但不链接。 -o :指定输出文件。 -pie :创建一个动态链接、位置无关可执行文件。 -I :指定头文件包含路径。 -L :指定链接包含路径。...-shared :创建共享库/动态库。 -static :使用静态链接。 --help :显示帮助信息。 --version :显示编译版本信息。.../hello Hello, GetIoT Here is a shared library 方式二:使用 rpath 将共享库位置嵌入到程序 gcc hello.c -L....这种方式要求共享库必须有一个固定安装路径,欠缺灵活性,不过如果设置了 LD_LIBRARY_PATH,程序加载时也是会到相应路径寻找共享

73340
  • 【Linux】《how linux work》第十五章 开发工具

    To compile and create the executable, use a command like this: 您必须告诉链接非标准库位置;用于此参数是-L。...接下来章节将告诉你如何使用和维护系统共享库。 如果你对共享工作原理感兴趣,或者想了解链接一般情况,可以查阅 John R....共享常见问题之一是动态链接找不到库。 动态链接通常应该首先查找共享位置是可执行文件预配置运行时库搜索路径(rpath),如果存在的话。您将在稍后看到如何创建此路径。...-Wl,-rpath选项告诉链接将一个后续目录包含到可执行文件运行时库搜索路径中。但是,即使你使用了-Wl,-rpath,你仍然需要-L标志。...Lex是一个将文本转换为带有标签编号标记分词GNU/Linux版本被称为flex。你可能需要与Lex一起使用-ll或-lfl链接标志。 Yacc是一个根据语法尝试读取标记解析

    10510

    浅谈Linux动态链接

    如果找不到,需要使用环境变量LD_LIBRARY_PATH来调整,下文将介绍环境变量LD_LIBRARY_PATH。 SONAME文件命名规则 so文件后面往往跟着很多数字,这表示了不同版本。...这种比较适合在多人共享服务上使用不同版本库,比如CUDA这种版本变化较快,且深度学习程序又高度依赖库。 除了LD_LIBRARY_PATH环境变量外,还有一个LD_PRELOAD环境变量。...GCC编译选项 使用GCC编译链接时,有两个参数需要注意,一个是-l(小写L),一个是-L(大写L)。...我们也可以用-L/path/to/library方式,让链接ld去/path/to/library路径下去找库文件。...如果动态链接库文件在/path/to/library,库名叫name,编译链接方式如下: $ gcc -L/path/to/library -lname myfile.c

    9K30

    这篇文章不知道起什么名字

    inline函数、使用寄存等优化技术 -O5:此选项类似于-O2,作用是优化所占用空间,但不会进行性能优化,常用于生成最终版本 备注:指定了-L dir和-l库名参数,但通过ldd命令查看时,找不到指定链接....so文件,此时需要通过修改LD_LIBRARY_PATH或者/etc/ld.so.conf文件来指定动态库目录,通过此做法可解决库无法链接问题。...凡是-x后面所列所有文件都会被视为其指定类型,要想改变类型可以再一次使用-x选项,或者使用-x none回到默认设置 -l library:进行连接时搜索名为library库 -L dir:把dir...配合-E选项使用 -P:告诉预处理不要产生#inline命令。配合-E选项使用 -static:在支持动态链接系统上,阻止链接共享库。...-nostdlib:不链接系统标准启动文件和标准库文件,只把指定文件传递给链接 -W:打印一些额外警告信息 -w:禁止显示所有警告信息 -msse/-msse2/mmx/mno-sse/mno-sse2

    74030

    GCC写个库给你玩,就这?

    前言 什么是GCC GCC原名为 GNU C语言编译 「GCC」(GNU Compiler Collection,GNU编译套件) 是由GNU开发编程语言编译。...g++ -v g++ --version gcc和g++区别 gcc和g++ 都是GNU (组织)一个编译。...库文件有两种,静态库和动态库(共享库) 「静态库(.a)」:程序在编译链接时候把库代码链接到可执行文件中。程序运行时候将不再需要静态库。静态库比较占用磁盘空间,而且程序不可以共享静态库。...运行时也是比较占内存,因为每个程序都包含了一份静态库。 「动态库(.so或.sa)」:程序在运行时候才去链接共享代码,多个程序共享使用库代码,这样就减少了程序体积。...-l 在程序编译时候,指定使用库 -L directory 指定编译时候,搜索路径 生成动态库(共享库) 动态库命名规则: 「Linux : libxxx.so」 「lib : 前缀(

    1.1K10

    Linux gcc编译生成静态库和共享动态库过程

    libraries: libmyhello.so: cannot open shared object file: No such file or directory 如下图所示,可执行文件hello找不到链接动态库...如下图所示,使用ln -sf libmyhello.so.1 libmyhello.so命令创建链接到soname共享库文件名(Link Name):libmyhello.so。 ​...这里如果和前面一样,直接链接创建动态库文件libmyhello.so生成可执行文件hello,然后直至执行hello,那么也会提示找不到链接动态库libmyhello.so: [root@typecodes...-lmyhello 原因也是一样,可执行文件hello找不到链接库: 1 2 3 4 5 [root@typecodes ~]# ldd hello linux-vdso.so.1 =...root用户权限,对于非root用户有方法二来解决:如前文《Linux gcc链接动态库出错:LIBRARY_PATH和LD_LIBRARY_PATH区别》所述,只要在当前Linux系统中配置LD_LIBRARY_PATH

    61221

    Linux命令(65)——ld命令

    1.命令简介 ld命令是二进制工具集GNU Binutils一员,是GNU链接,用于将目标文件与库链接为可执行程序或库文件。...-E,--export-dynamic:对于ELF格式文件,创建动态链接可执行文件时,把所有符号添加到动态符号表 -f ,--auxiliary=:对于ELF格式共享对象,设置...这告诉动态链接,正在创建共享对象符号表应该用作共享对象名称符号表筛选。 -g:被忽略。...用于提供和其他工具兼容性 -h:对于ELF格式共享对象,设置 DT_SONAME 名称 -I,--dynamic-linker=:指定动态链接。...-l ,--library=:把指定库文件添加到要链接文件清单 -L ,--library-path=searchdir:把指定路径添加添加到搜索库目录清单

    17.5K13

    Linux共享库、静态库、动态库详解

    ,这里有一个文档专门介绍为什么不使用LD_LIBRARY_PATH这个变量。...ldconfig不设置链接名称; 通常这是在库安装期间完成链接名称简单地创建为“最新”soname或最新真实名称符号链接。...我建议将链接名称作为与soname符号链接,因为在大多数情况下,如果您更新库,那么您希望在链接时自动使用它。我问HJ Lu为什么ldconfig不会自动设置链接名称。..., LD_LIBRARY_PATH适用于开发和测试,但不应由正常用户正常使用安装过程进行修改; 请参阅http://www.visi.com/~barr/ldpath.html 上为什么LD_LIBRARY_PATH...,它创建两个对象文件(ao和bo),然后创建一个包含它们共享库。

    8.9K11

    linux编译so库「建议收藏」

    将这几个文件编译成一个动态库:libtest.so gcc test_a.c test_b.c -fPIC -shared -o libtest.so 分析:-fPIC是位置无关码,-shared是按照共享方式来链接...-ltest -o main 分析: -L参数:指明要链接so库所在路径(如-L. 表示当前路径, -L...../so 表示当前路径上一层目录so子文件夹中) -l参数:指明要连接名字,如-ltest 表示要链接libtest.so库 三、运行main 现象:运行出错,报错信息: error while...系统加载so库思路: ①首先到LD_LIBRARY_PATH这个环境变量所指定目录下去寻找 ①如果找不到,再去/usr/lib, /lib等专门存放库目录下寻找 解决方法一: 将libtest.so...如:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/mnt/hgfs/winshare/so_test 补充:ldd命令 作用:查看一个可执行程序使用了哪些共享库,

    3.4K40

    小心两个共享库共用同一个静态库

    .html(Linux上制作可执行共享库示例) 问1:如果测试中全局变量global_var是个带构造和析构对象,会如何?...,否则链接时会报某些符号找不到(详细请参见:链接静态库顺序问题)。...存放是编译版本信息,比如字符串:”GCC: (GNU) 4.2.0” 自定义段 GCC提供了一个扩展机制,使得程序员可以指定变量所处段: 1....原因是两个共享库存在相同代码段,如果被依赖共享库,则不存在这个问题 -Wl使用 -Wl表示后面的参数传递给链接,其中l是linker意思。...链接时指定共享搜索路径(类似于设置LD_LIBRARY_PATH): -Wl,-rpath=/usr/local/abc:/data/abc 以上也可以分开写:

    2.7K50

    吴章金: 如何创建一个*可执行*共享

    ,执行加载后可直接运行 共享库 如果可执行文件用到外部库函数,那么需要通过动态链接加载引用到共享库并在运行时解析用到相应符号 所以,前者和后者通常情况下是独立存在,是联合行动,两者差异明显:...可执行文件有标准 C 语言程序执行入口 main,而共享库则并没有这类强制要求 后者为了确保可以灵活被多个可执行文件共享,所以,符号地址在链接时是相对,在装载时动态分配和计算符号地址 接下来做个实验具体看看两者区别.../hello.noc hello 通过实验,可以确认“正常”创建出来共享库并不能够直接运行,而是需要链接到其他可执行文件中。.../libhello.so hello 也可以当共享库使用: $ gcc -m32 -o hello.noc -L./ -lhello $ LD_LIBRARY_PATH=$LD_LIBRARY_PATH.../hello.noc hello 最后还有一点遗憾,怎么样才能“动态”链接,而不是手动指定动态链接呢?我们在程序中主动加入一个 .interp 节区来指定动态链接吧。

    1.1K20

    详解动态库和静态库

    /mylib/include 此时依然没有编译成功,此时不是找不到头文件,而是链接错误。...gcc在编译时候,只会去默认路径下查找打包头文件,不会去/mylib/include中查找,编译在gcc是就找不到酷libmyc.a,也就是编译链接失败。...而一个路径下可以有多个库,如果只指定路劲,编译还是不知道该去链接哪个库,因此还要在后面使用 -l 选项指定待链接具体名称。...动态库 动态库(.so):程序在运行时候才去链接动态库代码,多个程序共享使用库代码。.../lib64)下建立软链接 将自己库所在路径,添加到系统环境变量 LD_LIBRARY_PATH 中,该环境变量就是专门用来搜索动态库 但是重新启动系统后,就找不到该环境变量,如果想让系统启动时自动添加该路径到

    17210

    error adding symbols: DSO missing from command line

    错误原因 该错误通常出现在使用GNU编译(例如GCC)进行编译和链接时。它发生主要原因是未在链接命令中指定所需共享对象库。...添加共享对象库路径 错误消息中提到共享对象库(DSO)可能位于系统非标准路径中。要解决这个问题,你可以使用-L选项来添加共享对象库路径。...例如: bashCopy code gcc -o myprog myprog.o -L/path/to/libs -lmylib 这将告诉编译在指定路径中搜索所需共享对象库。 2....指定共享对象库名称 如果在错误消息中提到了具体共享对象库名称,那么可能是因为你在链接命令中没有指定该库。你可以使用-l选项,后跟库名称,来告诉编译链接该库。...DSO是动态共享对象(Dynamic Shared Object)缩写,也称为共享库(Shared Library)或共享对象库(Shared Object)。

    2.9K10

    Linux编译工具:gcc入门

    什么是gcc gcc全称是GNU Compiler Collection,它是一个能够编译多种语言编译。...最开始gcc是作为C语言编译GNU C Compiler),现在除了c语言,还支持C++、java、Pascal等语言。gcc支持多种硬件平台。...共享库有时候并不不在当前目录下,为了让gcc能够找得到共享库,有下面几种方法: 拷贝.so文件到系统共享库路径下,一般指/usr/lib 在~/.bash_profile文件中,配置LD_LIBRARY_PATH...库搜索路径 库搜索路径遵循几个搜索原则:从左到右搜索-I -l指定目录,如果在这些目录中找不到,那么gcc会从由环境 变量指定目录进行查找。...头文件环境变量是C_INCLUDE_PATH,库环境变量是LIBRARY_PATH.如果还是找不到,那么会从系统指定指定目录进行搜索。

    4.7K50

    关于gcc、glibc和binutils模块之间关系

    一、关于gcc、glibc和binutils模块之间关系 1、gcc(gnu collect compiler)是一组编译工具总称。...(4)direct,文件目录操作 (5)elf,共享动态加载,也即interpreter (6)iconv,不同字符集编码转换 (7)inet,socket接口实现 (8)intl,国际化,...3、修改gccspec文件(/usr/lib/gcc-lib/i386-redhat-linux/3.2.2/specs),更改ld-linux.so.2为/usr/local/lib下共享库装载...注意,在configure前,需要设置ld缺省连接路径(LIBRARY_PATH=/usr/local/lib:/lib:/usr/lib),否则binutils会configure出错,找不到libc...可以通过GCC_EXEC_PREFIX来设定 (3)LIBRARY_PATH环境变量中所设定路径,或编译命令行中指定-L/usr/local/lib (4)binutils中ld所设定缺省搜索路径顺序

    2.6K91

    【Linux】————动静态库

    是Linux环境变量名,该环境变量主要用于指定查找共享库(动态链接库)时除了默认路径之外其他路径)命令指定,假如现在需要在已有的环境变量上添加新路径名,则采用如下方式: LD_LIBRARY_PATH...六.如何知道一个可执行程序依赖哪些库 ldd命令可以查看一个可执行程序依赖共享库 七:重点 1.静态库: 1.1、怎么做静态库: 在Linux环境下,通常使用GCC(GNU Compiler Collection...)编译来编译源代码,并使用ar(archiver)工具来创建静态库 编写源代码:首先,你需要有一些源代码文件,比如 x.c ,y.c ,z.c 编译源代码为对象文件:使用GCC编译将源代码编译为目标文件...方式三:通过命令链接静态库 为什么不能直接使用 gcc main.c myc.a 因为告诉了gcc/g++编译,但是没有告诉操作系统!!!...使用静态库:在编译其他程序时,可以通过-I(指定用户自定义头文件搜索路径) -L(指定用户自定义库文件搜索路径)和 -l(执行确定第三方库名称,去掉前缀lib和后缀.a)选项来链接静态库。

    5810

    CC++常见gcc编译链接错误解决方法

    用“-Wl,-Bstatic”指定链接静态库,使用“-Wl,-Bdynamic”指定链接共享库,使用示例: -Wl,-Bstatic -lmysqlclient_r -lssl -lcrypto...-Wl,-Bdynamic -lrt -Wl,-Bdynamic -pthread -Wl,-Bstatic -lgtest ("-Wl"表示是传递给链接ld参数,而不是编译gcc/g++参数...-static,它存在,要求链接必须是静态库,而不能是共享库 ld: attempted static link of dynamic object 如果是以-L加-l方式指定,则目录下必须有....a文件存在,否则会报-l库文件找不到:ld: cannot find -lACE 6) GCC编译遇到如下错误,可能是因为在编译时没有指定-fPIC,记住:-fPIC即是编译参数,也是链接参数...25) 编译gcc时,如果遇到下面这个错误,这是因为运行时找不到mpc、mpfr和gmpso文件: checking for x86_64-unknown-linux-gnu-nm...

    7.8K30

    linux 动态库 静态库_静态库里面包含动态库

    可以很明显看到动态链接文件大小明显要比静态链接文件大小要小多了,这是为什么呢?...其实,动态链接是当执行到要调用接口时,编译会自动去搜寻所链接库,而静态链接则是暴力将所要用库中可执行程序使用二进制代码全部拷贝到我们生成可执行文件中,这也就是为什么静态链接生成文件这么大原因了...其实gcc编译时去链接库和头文件是去默认路径以及当前路径寻找,而我们将静态库打包到lib目录下,gcc编译时就找不到我们库了,所以我们需要加一些选项来告知gcc去寻找指定路径库及头文件。...gcc寻找默认路径: /usr/include 因此,正确链接指令为: gcc -o main main.c -I ./lib -L ....-lL小写)+库名字:表示要具体链接是哪一个库,因为指定目录下可能不止一个库,所以要指明库名字。

    7.4K20
    领券