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

linux下的so、o、lo、a、la文件的区别

o: 编译的目标文件 a: 静态库,其实就是把若干o文件打了个包 so: 动态链接库(共享库) lo: 使用libtool编译出的目标文件,其实就是在o文件中添加了一些信息 la: 使用libtool编译出的库文件...考虑以下情况:要从myprog.o文件编译生成myprog,其依赖于库liba.so(使用libtool生成),liba.so又依赖于libb.so(libb.so的生成不使用libtool),而且由于某种原因...说“可能”,是因为如果在本地编译的情况下,gcc在命令行中找不到一个库(比如上面的liba.so)依赖的其它库(比如libb.so),链接器会按照某种策略到某些路径下面去寻找需要的共享库: 1....但在交叉编译下,上述八种策略,可以使用的仅仅有两个:-rpath-link,-rpath。...这两个选项在上述八种策略当中优先级最高,当指定这两个选项时,如果链接需要的共享库找不到,链接器会优先到这两个选项指定的路径下去搜索需要的共享库。

9K30

Ubuntu 12.04 + opencv 2.4.1 + Qt 4.8.3 + Qt creater 2.5.2 安装配置

make   uninstall make   clean rm -rf XXX  //XXX 目录 如果是编译过程出错,要重新编译 那就 make clean 然后再 ....例如libcap.so.1和libcap.so.2是两个主版本号不同的libcap,有些应用程序依赖于libcap.so.1,有 些应用程序依赖于libcap.so.2,但对于依赖libcap.so.1...linker name仅在编译链接时使用, gcc 的-L 选项应该指定linker name所在的目录。...编译器会在这些 搜索路径以及-L 选项指定的路径中查找用 -l 选项指定的库,比如-lstack, 编译器会首先找有没有共享库libstack.so,如果有就链接它,如果没有就找有没有 静态库libstack.a...所以编译器是优先考虑共享库的,如果希望编译器只链接静态库,可以指定-static选项。当然也可以具体指定库全称的 路径,如 ../../libstack.a 。

1.7K100
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    GCC编译选项_需要使用安全编译选项的语言

    好了现在我们知道怎么得到库名了,比如我们自已要用到一个第三方提供的库名字叫libtest.so,那么我们只要把libtest.so拷贝到/usr/lib里,编译时加上-ltest参数,我们就能用上libtest.so...,还是会出错,因为ld只会找libxxxx.so,所以如果你要用到xxxx库,而只有libxxxx.so.x或者libxxxx-x.x.x.so,做一个链接就可以了ln -s libxxxx-x.x.x.so...环境变量设定方法:export ENV_NAME=xxxxxxxxxxxxxxxxx 9、关于交叉编译 交叉编译通俗地讲就是在一种平台上编译出能运行在体系结构不同的另一种平台上...当然两个平台用的都是linux。这种方法在异平台移植和嵌入式开发时用得非常普遍。 相对与交叉编译,我们平常做的编译就叫本地编译,也就是在当前平台编译,编译得到的程序也是在本地执行。...用来编译这种程序的编译器就叫交叉编译器,相对来说,用来做本地编译的就叫本地编译器,一般用的都是gcc,但这种gcc跟本地的gcc编译器是不一样的,需要在编译gcc时用特定的configure参数才能得到支持交叉编译的

    1.2K20

    Linux应用开发: SQLite数据库交叉编译部署与运用

    一、数据库介绍 1.1 数据库简介 数据库是以一定方式储存在一起、能与多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合,可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据进行新增...二、sqlite数据库编译安装(ARM) 目标: 将sqlite交叉编译后部署到嵌入式开发板环境下运行。...当前使用的目标开发板是: 友善之臂的tiny4412开发板,交叉编译器的版本是官方自带的4.5.1 宿主机采用的是Redhat6.3 、当然使用ubuntu、或者其他发行版都可以。...将生成的库文件拷贝到开发板的lib目录下,方便开发板上执行包含数据库的可执行文件时,能找到动态库。...为了交叉编译器在编译,包含数据库的源文件时,方便找到头文件和库文件,需要将生成的库文件和头文件分别拷贝到交叉编译目录下。

    1.1K20

    Linux编译相关命令

    -fPIC -shared hello.cpp -o libmyhello.so (5)使用动态库 动态库的时候和静态库使用一样,唯一值得注意的是当目录中同时存在相同名称的动态库和静态库时...,编译的时候优先使用动态库 2、fPIC选项 加上fPIC选项生成的动态库时位置无关的,可以实现多个进程共享动态库,多个进程引用同一个PIC动态库时,可以共享内存。...不加fPIC,则加载so文件时,需要对代码段引用的数据对象需要重定位,重定位会修改代码段的内容,这就造成每个使用这个.so文件代码段的进程在内核里都会生成这个.so文件代码段的copy.每个copy都不一样...,可以通过修改配置文件/etc/ld.so.conf中指定的动态库搜索路径,然后执行ldconfig命令来改变 (4)编译链接添加-WL,-rpath命令选项,将运行时动态库的搜索路径记录在可执行程序中...g++ main.cpp -o a.out -L ./ -lfunc 编译得到a.out,执行a.out,提示出错 ldd查看a.out依赖的动态库,发现libfunc.so

    3.4K00

    动态链接的步骤与实现

    其实我们在前面分析地址无关代码时已经提到过,实际上使用PIC模式编译的共享对象,对于模块内部的函数调用也是采用跟模块外部函数调用一样的方式,即使用 GOT/PLT的方式,所以在 GOT/PLT没有被重定位之前...如果这个ELF共享对象还依赖于其他共享对象,那么将所依赖的共享对象的名字放到装载集合中。...,那么由于b1.c和b2.c都用到了外部函数“a”,但由于源代码中没有指定依赖于哪一个共享对象中的函数“a”,所以我们在编译时指定依赖关系。.../main a1.c a1.c 很明显,main依赖于b1.so和b2.so;b1.so依赖于a1.so;b2.so依赖于a2.so,所以当动态链接器对main程序进行动态链接时,b1.so、b2.so...这种一个共享对象里面的全局符号被另一个共享对象的同名全局符号覆盖的现象又被称为共享对象全局符号介入(Global symbol interpose) 关于全局符号介入这个问题,实际上Linux下的动态链接器是这样处理的

    1.4K20

    【一站式解惑】Linux中.a、.so和.o文件以及-I,-L,LIBRARY_PATH,LD_LIBRARY_PATH等

    所谓动态就是exe运行的时候依赖于dll里面提供的功能,没有这个dll,你的exe无法运行。 lib,dll,exe都算是最终的目标文件,是最终产物。而c/c++属于源代码。...(1)命名规则: .so文件感觉很复杂,光是命名规则就已经看得我很晕了~整理一下,共享库需要:soname、real name,另外编译的时候名字也有说法。...在Linux下,共享库的加载是由/lib/ld.so完成的,ld.so加载共享库时,会从ld.so.cache查找。 创建函数库示例 我们通常把一些公用函数制作成函数库,供其它程序使用。...-lmyhello 或 [zhixa@ess ~test]$ gcc main.c libmyhello.so -o hello 这里不会出错(没有libmyhello.so的话,会出错),但是接下来..../hello 会提示出错,因为虽然连接时用的是当前目录的动态库,但是运行时,是到/usr/lib中找库文件的,将文件libmyhello.so复制到目录/usr/lib中就OK了。

    5.5K52

    交叉编译eudev+usbip

    因为工作需要在海思设备上交叉编译usbip,但是设备不是Ubuntu这样的操作系统,而是类似buildroot(不确定),需要自己交叉编译可执行程序和动态库。.../aarch64-mix410-linux/bin source ~/.bashrc 验证交叉编译工具链,避免一些出错无法定位,尤其时HOST本身的Ubuntu系统的gcc与交叉编译工具链有较大差异时...三、交叉编译usbip源代码 ./autogen.sh ....eudev源代码正常,但是使用交叉编译其他源代码时出现如下错误:--注意configure或者make的错误信息 aarch64-mix410-linux-gcc -c main.c -o main.o...eudev源代码configure时出现如下错误:----验证交叉编译工具是否可用,可解决此问题 checking whether the C compiler works... no /usr/lib

    4900

    Android FFmpeg系列01--编译与集成

    FFmpeg是一套用于录制、转换和流化音视频的完整的跨平台解决方案,它的强大之处不用过多描述,本文主要介绍如何编译出so文件和在Android Studio工程中的引入 交叉编译出so文件 交叉编译...在一个平台上生成另一个平台上的可执行代码叫做交叉编译,比如我们接下来要做的就是在PC平台上编译出Android系统能用的so 编译环境与工具链 既然是要编译出能在Android系统中可执行的so文件,那么我们肯定是不能在...PC的环境下直接编译的,交叉编译最重要的就是配置好编译过程中需要使用的相关环境 对于C/C++的编译,通常有GCC和CLANG两种工具 GCC是比较老牌的编译工具,不仅可以编译C/C++,也可以编译.../build_android_clang.sh 编译结束后我们得到了头文件、so文件和一些examples 构建脚本的一些解释 当我们配置--target-os=android时,默认的编译工具就是...通常来说编译的问题基本都是最终拼接下来的交叉编译工具路径不对,详细的异常信息可以通过查看config.log来进一步分析 使用FFmpeg so动态库 执行编译脚本后,我们得到了FFmpeg的so和头文件

    1K40

    Linux中CC++程序编译过程与动静态链接库概述

    ) 这里的输出表示可执行文件依赖于 libc.so.6 和 ld-linux-x86-64.so.2 等共享库。...--quiet:只输出错误信息。 注意事项 ldd 可能会执行被检查的程序,尤其是在处理不受信任的二进制文件时,可能会存在安全风险。...对于静态编译的程序,ldd 不会返回任何库,因为这些程序不依赖于共享库。 结论 ldd 是一个非常实用的工具,可以帮助开发者和运维人员排查动态链接库的问题,确保程序的可移植性和兼容性。...动态库的主要特点是可以在运行时被程序加载和使用,而不是在编译时将库的代码直接嵌入到可执行文件中。这使得程序可以共享同一个库,节省内存并简化更新过程。...动态库的特点 文件格式:动态库的文件名通常以 .so(Shared Object)为后缀,例如 libc.so.6。 共享性:多个程序可以共享同一个动态库,从而减少内存使用。

    29710

    基于 Alpine 的 Docker 镜像编译的程序无法在云函数环境运行

    最近有一个用户反馈, 他使用 golang:1.13.1-alpine3.10 这个镜像来编译的可执行程序无法在云函数的环境运行, 报错信息如下: fork/exec /var/user/main: no...Go 程序链接出错的信息, 看起来也是在 Alpine Linux 下编译的, 有人回复道 Alpine Linux 使用的不是 glibc 啊哈, 终于有线索了, 写代码验证一下 package main...IN A %s\n", ip.String()) } } 编译这段代码, 再次使用 ldd 查看一下程序依赖哪些 .so $ ldd main linux-vdso.so.1 =>...directory 正是本文一开始提到的出错信息 (完整的出错信息可通过使用 Go 的 os/exec 包启动 main-alpine 获得) 解决方案 问题的原因在于云函数的运行环境(CentOS)...因而使用 golang:1.13.1-alpine3.10 这个镜像编译出来的程序如果依赖于 musl libc, 则会在程序加载的时候找不到所需的动态库 解决问题的方法很简单, 只需将镜像换成 golang

    5.8K00

    Android NDK cmake编译方式(六)

    CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt文件转化为make所需要的makefile文件,最后用make命令编译源码生成可执行程序或共享库(...add_library 指令 add_library():用于将一组源文件编译生成一个库文件,并保存为 libname.so (lib 前缀是生成文件时 CMake自动添加上去的)。...中build我们的NDK工程时,Aandroid Studio会通过上面的步骤为我们设置好交叉编译环境,然后再将CMakelists.txt文件传给 CMake, CMake解析里面的内容,并最终调用不同平台的工具...总结 通过前文的介绍,主要了解 Android Studio 在开发 NDK 程序时,是怎样使用 CMake Gradle plugin 配置交叉编译环境的,同时了解了 CMake 编译 NDK 程序的基本流程...希望对大家理解最新的 Andriod Studio 是如何使用 CMake进行交叉编译的有所帮助。 [Github Demo下载链接]

    2.4K61

    linux升级 glibc

    fr=aladdin glibc是gnu发布的libc库,即c运行库。glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。...总的来说,不说运行在linux上的一些应用,或者你之前部署过的产品,就是很多linux的基本命令,比如cp, rm, ll之类,都得依赖于它 网上很多人有惨痛教训,甚至升级失败后系统退出后无法重新进入了...也可以直接从其他系统上好一个编译好的文件 libc.so.6(对应glibc 2.15或者更高的),不过最保险的方式就是下载源代码在本地编译一次(有的人实在编译不成功,那也只能从别的地方找一份了) 各个版本的...,真实的lib文件时libc.so, 输出 [html] view plain copy $ ll libc.so.6 lrwxrwxrwx 1 root root 7 Sep 23 07:41...这里要注意,更新系统里的链接(我的是/lib64/libc.so.6) 很容易出错,我不清楚有没有更好的办法,一般都是删除旧链接,建立新链接 但删除旧链接后,很多命令直接不能用了,因为此时中不到glibc

    20.7K40

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

    共享目标文件(.so,共享库),协同可执行文件创建进程映像 Core dump(core),运行过程中崩溃时自动生成,用于调试 我们来看中间两类: 可执行文件 如果不引用外部库函数,那么所有符号地址是确定的...可执行文件有标准的 C 语言程序执行入口 main,而共享库则并没有这类强制要求 后者为了确保可以灵活被多个可执行文件共享,所以,符号地址在链接时是相对的,在装载时动态分配和计算符号地址 接下来做个实验具体看看两者的区别...即使是我们提供了 main()(把标准 hello.c 编译为 libhello.so),程序的入口并没有指向它。...000003d0 : 那么,先解决入口的问题并运行,同样出错了: $ gcc -m32 -shared -fpic -o libhello.so hello.c...\n"); } 当普通共享库使用,默认编译即可,要能够执行的话,实现一下 entry(),编译时打开 EXEC_SHARED 即可: $ gcc -m32 -shared -fpic -o libhello.so

    1.1K20
    领券