首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

编译与链接过程的思考

关键词:预处理、编译、汇编、链接、动态链接静态链接、真机调试。 正文 以.c文件的编译流程为例,如下图。 我们按照以下的步骤,用gcc对代码进行编译。...1、静态链接 静态连接就是把静态连接(.a文件)中的文件链接到可执行文件中; .a文件是多个.o文件的组合; .o文件是对象文件,里面是机器指令; 链接就是多个.o文件打包成可执行文件;...(静态库里的代码会编译链接到可执行文件,资源文件需要重新打包成一个bundle文件放入ipa包) 思考题?...:CocoaPods很多第三方是包括UI资源的,然而我们知道.a文件是不包括资源的,那么第三方的资源如何处理的? 动态静态的制作 简书已经有非常详细的教程,介绍静态和动态的制作。...平时开发遇到问题,习惯性的刨根问底,这次简单把这些知识串联起来,并和工程作相应结合,加深记忆。 文章如有疏漏,敬请指出。 引用 《程序员的自我修养—链接、装载与》 C程序编译过程浅析

1.2K90

cmake链接静态-static-libstdc++问题

在嵌入式平台中,业务使用C语言开发,在交叉编译过程中会链接一个第三方的c++静态,该第三放使用了std,需要链接libstdc++的,由于所在的嵌入式平台中没有libstdc++.so,如果将libstdc...++.so拷贝板子上,需要占用5MB空间,很浪费空间,准备使用libstdc++的静态,在链接过程中出现如下问题;   整个业务的编译使用cmake构建,使用如下方式进行链接; add_executable...在cmake中有链接-static-libstdc++,而且交叉工具中是有libstdc++.a,当我们将cmake改为: add_executable(${target} ${src_sample...'lstdc++'是gcc和g++都能识别,但是'-static-libstdc++'只有g++可以识别,而我的业务代码都是使用C语言编写的,在链接cmake默认使用的是gcc,但是gcc不能识别'-...static-libstdc++',最终不会链接到实际的libstdc++.a,所以在链接出现不能识别std的问题; 知道原因了,就很好解决了,在链接阶段将cmake的链接选项改为g++即可,添加如下一行就可以正常链接成功

5.6K51

ERROR: Unable to find the development tool cc in your path; please make sure tha

解决方案2:配置符号链接如果已经安装了gcc,并且在运行gcc --version命令也没有出现错误,那么问题可能是由于cc未正确链接到gcc导致的。...在大多数情况下,cc是一个链接到gcc的符号链接。您可以通过以下步骤来检查和修复符号链接:打开终端或命令提示符。...安装完成后,再次检查cc命令是否存在,如果仍然不存在,则创建一个符号链接将cc指向gcc。无论是安装过程中出现错误还是修复过程中遇到问题,都会给出相应的提示。...在Windows上安装gcc:在Windows上安装gcc可以通过MinGW或MSYS2来实现。这两个工具都是提供了GNU工具在Windows上的移植版本。...MinGW:MinGW提供了一个自助式安装程序,它可以下载并安装基本的GCC和一些常用的软件。可以从MinGW官方网站(http://www.mingw.org/)下载安装程序,并按照提示进行安装。

1.5K20

Linux编译工具:gcc入门

编译阶段,gcc调用不同语言的编译器,例如c语言调用编译器ccl。gcc实际上是个工具,在编译程序的过程中调用不同的工具。汇编阶段,gcc调用汇编器进行汇编。...hello.c 或 gcc -c hello.c -o hello.o 编译生成可重定位目标文件 使用gcc可以加上-Wall选项。...使用的优点在于: 模块化的开发 可重用性 可维护性 又可以分为静态与动态静态(.a):程序在编译链接的时候把的代码链接到可执行文件中。程序运行的时候将不再需要静态。...然后就可以这样来使用静态libhello.a gcc -Wall main.c libhello.a -o main 还有另外一种使用方式: gcc -Wall -L. main.c -o main...-lhello 该命令与使用静态的命令相同,但是在共享静态共存的情况下,优先使用共享

4.7K50

在linux下制作静态和动态链接的方法

Linux中静态文件的后缀为"a"。 静态的代码在编译就已经链接到应用程序中 静态中的各个成员(.o文件)没有特殊的存在格式,仅仅是一个.o文件的集合。...lib和.a都是系统指定的静态文件的固定格式,mylib才是静态的名称, 编译,链接器会在标准路径(/usr/lib;/lib)或者用户指定的路径下去找.a的文件。...–lmylib -static指定编译器链接静态,-L.指定静态的路径为当前路径, 在gcc编译器中引用可搜索到的目录和文件需用(-l+名), 如在gcc中加入-lm可以在程序汇中链接标准算术...,加上-lpthread可以链接到linux标准线程 总结: 使用静态可以使程序不依赖于任何其他而独立运行,但是会占用很多内存空间以及磁盘空间, 而且如果文件更新,则需重新编译源代码...,使用起来不够灵活.其实,编译的时候不需要加-static, 直接用gcc -o main main.c -L.

3.1K20

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

(3)在动态的情况下,有两个文件,一个是引入库(.LIB)文件(实际上也算是一个静态,只是在链接只能把函数在DLL的入口链接到exe中,而不像真正静态链接那样将函数体真正链接到exe中 ,通过lib...动态在程序编译并不会被链接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。本节主要通过举例来说明如何在Linux中创建静态和动态,以及使用它们。...只需要在使用到这些公用函数的源程序中包含这些公用函数的原型声明,然后在用gcc命令生成目标文件指明静态名,gcc将会从静态中将公用函数连接到目标文件中。...这也进一步说明了动态在程序运行时是需要的。 我们回过头看看,发现使用静态使用动态编译成目标程序使用gcc命令完全一样,那当静态和动态同名gcc命令会使用哪个文件呢?...–lmyhello (动态静态同时存在,优先使用动态, 当然,直接gcc main.c libmyhello.a -o hello的话,就是指定为静态了) [zhixa@ess ~test

3.8K52

连1.0版本都没有,Uber为什么会采用这样一项新技术?

也就是说,在 macOS 上使用 Clang,在 Linux 上使用 GCC(无论什么版本)。...CGo 的可执行文件将链接到系统上发现的 glibc 版本。也就是说,在升级操作系统(数月的努力),构建机群必须最后升级。...Go 的新版本的官方二进制文件在构建使用GCC 版本,比我们的一些构建机器上的新。在这些机器上,我们不得不通过从源代码编译 Go 来解决这个问题。...我希望我的二进制文件是静态的,但 Bazel 并没有让这个过程变得简单。...还有一个问题需要注意:我们知道,如果我们在重要的地方使用 Zig,会遇到问题,但又可能不具备解决这些问题的专业知识。作为一家大公司,我们该如何降低采用风险,确保严重的 Bug 及时得到处理?

1.4K20

Linux编译器---gccg++使用详解

实例: gcc test.o -o test.exe 上述的四个指令,实际上在使用时都被压缩成了一条指令,直接编译: gcc test.c -o test ⭐函数 ⚡概念 函数(Library...实际上,系统把这些函数实现都被做到名为 libc.so.6 的文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,...⚡动态静态 静态(Static Library): 静态在编译被链接到可执行文件中,编译后的可执行文件包含了静态中的代码。...每个使用静态的可执行文件都会包含一份静态的副本,因此可执行文件体积较大。 静态的代码在编译被复制到可执行文件中,程序运行时不需要外部文件。...gcc的默认链接方式是链接动态,我们可以手动修改为链接静态gcc -static test.c -o test-static 可以发现通过链接静态生成的可执行程序的大小远远大于通过链接动态生成的可执行程序的大小

29510

CC++生态工具——gccg++编译器使用指南

GCCgcc是两个概念,GCC是工具的集合,里面除了gcc/g++还包含了ccl,cclplus等组件。gcc/g++只是GCC工具的一个子集。...创建静态的时候,需要使用"gcc/g++ -c"先将xxx.c源文件编译为目标文件xxx.o,然后使用ar指令将xxx.o打包成xxxx.a静态。...目标程序与静态链接,目标程序代码调用的任何外部函数的代码都会从静态中复制到最终的可执行文件中。...GCC在链接优先使用动态,只有当动态不存在才开始使用静态,如果要强制使用静态,编译加上-static参数。 使用-Wl,-Bstatic告诉链接器优先使用静态。...静态链接,搜索文件路径的顺序: 1. ld会去找GCC命令中的参数-L 2. gcc的环境变量LIBRARY_PATH 3.

2.1K30

gcc编译器参数_gcc for c4droid

编绎该文件,在编绎可以使用任何全法的编绎参数,例如-g加入调试代码等: gcc -c hello.c -o hello.o (1)连接成静态 连接成静态使用ar命令,其实ar是archive的意思...例如:我们将创建的静态名为myhello,则静态文件名就是libmyhello.a。在创建和使用静态,需要注意这点。创建静态用ar命令。...只需要在使用到这些公用函数的源程序中包含这些公用函数的原型声明,然后在用gcc命令生成目标文件指明静态名,gcc将会从静态中将公用函数连接到目标文件中。...,也是在使用到这些公用函数的源程序中包含这些公用函数的原型声明,然后在用gcc命令生成目标文件指明动态名进行编译。...这也进一步说明了动态在程序运行时是需要的。 我们回过头看看,发现使用静态使用动态编译成目标程序使用gcc命令完全一样,那当静态和动态同名gcc命令会使用哪个文件呢?

90930

自定义规则实现将多个静态合并为一个动态静态

比如我们手动的将多个静态(libA.a、libB.a、libC.a)合并为一个动态(libcombined.so): $ gcc -shared -fPIC -Wl,--whole-archive...另外我们还需要传入 gcc 将多个静态合并成一个动态的相关参数、待合成的静态列表、最后要生成的动态名称和路径。这样就是一个比较完善的自定义规则了。...2 自定义规则实现 2.1 规则功能 将多个静态合并成一个动态 将多个静态合并成一个静态 可以设置生成的名称和生成路径 静态作为规则依赖 2.2 实现规则的理论基础 将多个静态合并成一个动态...另外创建的中间文件因为是拷贝过程,实际生成的中间文件,Bazel 已经做了处理,居然是软链接到沙箱(sandbox)源文件,这中间的原理我暂未弄清楚,或许就是沙箱优化 对于交叉编译器,我们必须使用 find_cpp_toolchain...(ctx),而不是直接使用 /usr/bin/gcc 等工具 这里实现自定义规则,我们只使用了 action.run_shell。

5K20

到底是个啥?为啥要链接,链接的本质又是个啥?

我们可以推出了在编程中,一旦一个东西被广泛的应用,甚至成为标配,就意味着这个东西一定有种不可替代或者使用面广的的功能。...各步骤对应的gcc 命令(我们平时使用-o命令,是直接将所有步骤合在一起了) 不同步骤产生的对应文件后缀 从上图我们可以知道,预处理、编译、汇编、链接生成的文件后缀分别是...) 静态(.a):程序在编译链接的时候把的代码链接到可执行文件中。...o [root@localhost linux]# ls add.c add.h add.o libmymath.so main.c sub.c sub.h sub.o 三、使用 由于静态是直接在编译链接的时候把的代码链接到可执行文件中...但是静态由于编译链接不把的代码链接到可执行文件中,而是在运行时,由操作系统从磁盘上的该动态中复制到内存中(动态链接),所以除了我们在生成动态告诉可执行文件的存在,还需要告诉操作系统的存在与路径

39110

静态和动态制作

所谓的静态、动态指的是链接的过程。 ---- 一、静态和动态介绍 1、静态 程序在编译链接的时候把的代码链接到可执行文件中,程序运行的时候将不再需要静态。...在这里插入代码片 4、使用静态 gcc test.c libmymath.a -o test ....三、动态的制作及使用 动态的名字是以 lib 开头,以 .so 结尾,例:libmylib.so 1、生成位置无关的 .o 文件 gcc -c sub.c -o sub.o -fPIC 使用...-fPIC 这个参数过后,生成的函数就和位置无关,挂上 @plt 标识,等待动态绑定 2、制作动态 gcc -shared -o libmymath.so sub.o 3、使用动态 -l :指定名.../test 出错原因分析: 连接器: 工作于链接阶段,工作需要 -l 和 -L 动态链接器: 工作于程序运行阶段,工作需要提供动态所在目录位置 解决办法:指定动态路径并使其生效,然后再执行文件

17320

Linux编译器-gccg++使用

最后的答案是 : 系统把这些函数实现都被做到名为 libc.so.6 的文件中去了 , 在没有特别指定时 ,gcc 会到 系统默认的搜索路径“/usr/lib” 下进行查找 , 也就是链接到...静态是指编译链接 , 把文件的代码全部加入到可执行文件中 , 因此生成的文件比较大 , 在运行时也 就不再需要文件了。...动态一般后缀名为 “.so”, 如前面所述的 libc.so.6 就是动态 gcc 在编译默认使用动态。完成了链接之后 ,gcc 就可以生成可执行文件 , 如下所示。...缺点:对的依赖性较强,一旦缺失,所有使用的程序都无法运行。 静态: 优点:不依赖,同类型平台中可以直接运行使用。 缺点:所执行程序体积较大,比较浪费资源。...gcc的默认连接方式是动态连接,如果想进行静态连接,则需要使用-static选项。 gcc -o b.out -static 今天的分享到这里就结束,感谢大家的阅读!

13210

【Linux】gcc&g++与 的美妙邂逅(5)

最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的文件中去了,在没有特别指定时,gcc 会到 系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去...静态) 三.Linux编译器-gcc/g++使用 1. gcc/g++是什么?...【动态/动态链接】与【静态/静态链接】 动态与之相反,在编译链接并没有把文件的代码加入到可执行文件中,而是在程序执行时由运行时 链接【文件加载】,这样可以节省系统的开销。...动态一般后缀名为“.so”,如前面所述的 libc.so.6 就是动态 gcc 在编译默认使用动态。完成了链接之后,gcc 就可以生成可执行文件,如下所示。...gcc hello.o –o hello 静态是指编译链接,把文件的代码全部加入到【可执行文件】中,因此生成的文件比较大,但在运行时也 就不再需要文件了。

13210
领券