首页
学习
活动
专区
工具
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.2K20

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,程序加载时也是会到相应路径寻找共享库的。

74840
  • 【Linux】掌握库的艺术:我的动静态库封装之旅

    也就是说,这个动态库的名字就是c,没错这就是c运行库。 1.2.2 静态库 静态库是将一组对象文件(.o 文件)打包成一个库文件(通常为 .a 后缀),在编译时将其链接到最终生成的可执行文件中。...这种特性在动态链接库和共享库中非常重要,因为它们可以被多个进程共享,并在加载时被放置到不同的内存地址。 为了实现位置无关,编译器在生成代码时使用相对地址而不是绝对地址。.../mylib/include dynLibTest.c 现在的错误就是,找不到目标函数了,因为我们没有给编译器指明在哪里,它肯定就找不到了。.../mylib/include -L./mylib/lib dynLibTest.c -lmyc ‘-I’:指定头文件搜索路径。 —L:指定库文件搜索路径。 -l:指明需要链接库文件路径下的哪一个库。...—L:指定库文件搜索路径。 -l:指明需要链接库文件路径下的哪一个库。 在动态库的篇章中,我们就已经了解了指定库的路径了。 在静态库也同理。 gcc staLibTest.c -I.

    8410

    【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是一个根据语法尝试读取标记的解析器。

    11110

    浅谈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

    9.1K30

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

    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

    69821

    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.7K13

    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

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

    .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

    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

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

    ,执行加载后可直接运行 共享库 如果可执行文件用到外部库函数,那么需要通过动态链接器加载引用到的共享库并在运行时解析用到的相应符号 所以,前者和后者通常情况下是独立存在的,是联合行动的,两者差异明显:...可执行文件有标准的 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 中,该环境变量就是专门用来搜索动态库的 但是重新启动系统后,就找不到该环境变量,如果想让系统启动时自动添加该路径到

    21810

    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)。

    3.5K10

    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.8K50

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

    一、关于gcc、glibc和binutils模块之间的关系 1、gcc(gnu collect compiler)是一组编译工具的总称。...(4)direct,文件目录操作 (5)elf,共享库的动态加载器,也即interpreter (6)iconv,不同字符集的编码转换 (7)inet,socket接口的实现 (8)intl,国际化,...3、修改gcc的spec文件(/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.7K91

    【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)选项来链接静态库。

    7110

    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和gmp的so文件: checking for x86_64-unknown-linux-gnu-nm...

    7.9K30
    领券