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

再议GCC编译时的静态库依赖顺序问题

GCC编译时的静态库依赖次顺问题.pdf 假设有如三个源代码文件: $ cat a.cpp void a() { } $ cat b.cpp extern void a(); void b...} 对应的Makefile文件: all: x liba.a: a.o libb.a: b.o x: x.o liba.a libb.a # 问题出在这儿 g++ -g -o $@ $^ a.o:... -g -c $^ b.o: b.cpp g++ -g -c $^ x.o: x.cpp g++ -g -c $^ clean: rm -f a.o b.o x.o x 使用上面的Makefile编译...b.cpp依赖a.cpp,gcc要求(实际是ld要求)libb.a须放在liba.a前面,即需要改成:g++ -g -o x x.o libb.a liba.a,也就是被依赖的库需要放在后头。...这里的“-Wl,”表示后面跟着的参数是传递给链接器ld的,gcc不关心具体是啥。“--start-group”表示范围的开始;“--end-group”表示范围的结束,是可选的。

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

    ubuntu gcc编译时对’xxxx’未定义的引用问题

    http://www.cnblogs.com/oloroso/p/4688426.html gcc编译时对’xxxx’未定义的引用问题 原因 解决办法 gcc 依赖顺序问题 在使用gcc编译的时候有时候会碰到这样的问题...,编译为.o(obj) 文件没有问题,但是编译(这一步应该是链接)为可执行文件的时候会出现找不到’xxx’的定义的情况。...但是看上面编译的时候是有添加-ldl选项的,那么为什么不行呢? gcc 依赖顺序问题 这个主要的原因是gcc编译的时候,各个文件依赖顺序的问题。...在gcc编译的时候,如果文件a依赖于文件b,那么编译的时候必须把a放前面,b放后面。...例如:在main.c中使用了pthread库相关函数,那么编译的时候必须是main.c在前,-lpthread在后。gcc main.c -lpthread -o a.out。

    8.2K20

    【Groovy】编译时元编程 ( ASTTransformation#visit 方法中访问 Groovy 类、方法、字段、属性 | 完整代码示例及进行编译时处理的编译过程 )

    文章目录 一、ASTTransformation#visit 方法中访问 Groovy 类、方法、字段、属性 二、完整代码示例及进行编译时处理的编译过程 1、Groovy 脚本 Groovy.groovy...对象 , 用于访问 Groovy 的每个类 ; GroovyClassVisitor 对象中 , 提供了访问 类 、成员字段 、成员方法 、属性 、 构造函数的回调方法 ; 代码示例 : import...visitConstructor visitMethod main visitMethod run visitProperty name visitField name visitMethod hello 二、完整代码示例及进行编译时处理的编译过程..., 在文件中配置 ASTTransformation 实现类的全类名 : MyASTTransformation 3、使用命令行进行编译时处理 首先 , 进入 Y:\002_WorkSpace\003...编译时处理类 MyASTTransformation.groovy , 将编译后的字节码文件 MyASTTransformation.class 保存到 Y:\002_WorkSpace\003_IDEA

    89720

    gcc编译时文件扩展名为.S和.s的区别

    gcc编译时,文件扩展名为.S和.s的区别是,.S支持预处理,而.s不支持。 gcc编译一般分为四个阶段,分别是预处理、编译、汇编、链接。.../ 删除一些无关内容 extern int add(int a, int b); int main() { return add(1, 2); } 编译的作用是把c代码转成汇编代码: $ gcc...3 由上可见,文件扩展名为.s的文件其实就是汇编代码文件。 其实我们可以直接编写汇编代码,保存到以.s为后缀的文件里,然后再用gcc将其编译成可执行文件。...但.s为后缀的文件不支持预处理,如果我们想在汇编代码里使用宏或头文件,则保存该汇编代码的文件必须以.S结尾。.../a.out hello 由上可见,当文件扩展名为.s时,宏MSG是无法识别的,但扩展名改为.S后,该汇编代码可正常编译并执行。 希望对你有所帮助。

    6.9K31

    在 Windows 下用 GCC 编译器练习 CC++ 的简单教程

    写好代码,通过编译器把代码编译成可执行文件,写的程序就能运行了。 所以说,入门 C语言/ C++ 编程,实际上我们只需要两个工具:文本编辑器、编译器。其它的诸如调试器等工具都是围绕着它们工作的。...关于 GCC 的介绍 关于GCC的发展史,推荐阅读: 鸟哥的Linux私房菜 文本编辑器的选择与安装 说到文本编辑器,我们第一时间想到的应该就是记事本了,但是有一点大家要注意,不推荐使用记事本编辑代码。...接下来进入放源代码的文件夹,同样的方法,按住Shift在空白处点击右键,打开命令行窗口 这时候我们运行 gcc 把 first.c 编译成 Windows 可用的可执行文件,命令很简单 gcc first.c...ps: 如果你写的是C++,则需要用 g++ 调用GCC的C++编译器而不是 C语言编译器 gcc ,假定源文件是 first.cpp g++ first.cpp 输入完后回车,这时候gcc开始编译你告诉它的文件了...错误处理 如果源代码有语法错误的话,编译时编译器会报错并且不会生成目标代码。

    7.1K32

    Go 静态编译及在构建 docker 镜像时的应用

    Go 语言具有跨平台和可移植的特点,同时还支持交叉编译,可以在一个系统上编译出运行在另一个系统上的二进制可执行文件,这是因为 Go 在编译时支持将依赖的库文件与源代码一起编译链接到二进制文件中,所以在实际运行时不再需要依赖运行环境中的库...动态链接库避免了上述问题,应用程序在编译时只记录一些动态链接库的基础信息,在加载应用程序但还没有运行时会将依赖的动态链接库中的函数与内存中的程序链接起来形成一个完整的程序,所有引用同一个动态链接库的可执行文件共用这个库中的代码和数据...静态编译是在编译时就将依赖的静态链接库复制到可执行文件中,这样在应用程序运行起来后无需依赖外部的库,只需要单一的可执行文件即可运行,但缺点是应用程序体积相对较大,程序运行的越多重复占用的内存浪费越多。...如果在 Go 代码中包含 import "C" 并且开启 CGO,那么在 go build 编译时就会通过 CGO 来处理 C 代码,生成能够让 Go 调用 C 的桥接代码,然后交给 gcc 编译得到...第一阶段构建用来编译得到可执行文件,在第二阶段构建时可以将上一个阶段中产出的可执行文件 COPY 到当前构建的镜像中,从而实现与上述效果相同的减少镜像体积的目的。

    11610

    gcc编译时,链接器安排的【虚拟地址】是如何计算出来的?

    例如下面这段C代码: 首先编译出32位的可执行程序(为了避开一些与主题无关的干扰因素,采用了静态链接): gcc -m32 -static test.c -o test 编译得到ELF格式的可执行文件...这里就不再赘述了,只要记住2点: 从编译器的角度看,ELF 文件是由很多的节(Section)组成的; 从程序加载器的角度看,ELF 文件是又很多的段(Segment)组成的; 其实它俩没有本质区别,只不过是链接器在链接阶段...从内存映射的角度来看: 操作系统在把一个可执行程序加载到系统中时,把ELF文件中每个段的内容读取到物理内存中,然后把这个物理内存映射到该段对应的虚拟地址上(VirtAddr)。...操作系统在把它俩读取到内存中时,需要 2 个物理内存页来分别存储它们(每 1 个物理页的长度是4K): 虽然每一个物理内存页的大小是 4K,但是代码段和数据段实际上只使用了每个页面刚开始的一段空间。...再来看一下代码段的虚拟地址:在执行gcc指令的的时候,链接器把代码段的虚拟地址安排在0x0804_8000处: 也就是说:当CPU中(或者说程序代码中),使用0x0804_8000 ~ 0x0804_

    1.3K41

    手写 vite-plugin 在新建文件时自动使用模版代码

    在新部门做的是些运营类的管理后台的需求,就是表格表单的 CRUD。 可能来了个新需求,是回显下其他项目组的设备操作记录,于是 筛选项配置+表格配置+接口请求+按钮交互 还是这些玩意。...那么,考虑下自动化地完成这类 Ctrl+C 的工作就很合理了,思路如下: 准备各类型的模板代码(比如列表页/表单页/表单弹窗等) 监听文件被新建 用户手动选择模板代码类型 将模板代码拷贝至新建文件 准备模板代码...你可以去写个 npm scripts 在 dev 脚本时一起运行,但 vite-plugin 我觉得是更好的方式。...function bindFileServerWatcher(server) { // 新建文件时,询问模板代码类型,确认后自动使用模板代码 server.watcher.on('add',...,文件目录和名称即路由,在 vite-plugin 中动态地去修改 route config 注册路由那就更方便了。

    14430

    在ubuntu安装的软件在哪里找_ubuntu如何安装gcc编译器

    大家好,又见面了,我是你们的朋友全栈君 在ubuntu安装vscode和可视化的代码跟踪调试 在ubuntu安装vscode 一、命令安装 1....在命令行安装: 3. 在命令行执行: 二、汉化 在ubuntu中用vscode编译调试C\C++ 一、 安装插件 二、编译运行程序 在ubuntu安装vscode 一、命令安装 1....在命令行执行: code 二、汉化 在ubuntu中用vscode编译调试C\C++ 一、 安装插件 1.安装vscode的C\C++插件 在搜索框上输入C/C++,并下载,等待安装完成 2....安装vscode的Code Runner插件 在搜索框上输入Code Runner,并下载,等待安装完成 二、编译运行程序 使用之前安装好的Code Runner插件一键编译运行程序 点击:...新建文件,出现一个空白文档 将下面的代码复制粘贴到空白文档中 #include int main(){ char name[100]; printf("What is

    1.6K10

    编写你的专属 MSBuild C# 代码生成器:在保存文件时自动实时生成你的代码

    而本文是在此基础上更进一步,可以让生成代码变成实时的;更准确的说,是在保存文件时即生成代码,而无需完整编译一次项目。...一天,头像全白昵称空格的“wuweilai”童鞋问我为什么 GRPC 的 NuGet 包能自动在 .proto 文件保存时更新生成的代码,怎么才能做到像它那样。...我们即将实现的是:在保存 Test.txt 文件时,会立即执行我们的编译流程,这样,我们便能基于 Test.txt 来实时生成一些代码。...关于时机,可以阅读: 通过重写预定义的 Target 来扩展 MSBuild / Visual Studio 的编译过程 在制作多框架项目的 NuGet 包时应该注意的问题(buildMultiTargeting...对于已知的项(Item)来说,Generator 属性是 MSBuild 编译时的一个已知元数据(Metadata),其作用为当此文件改变时,会执行一个指定的 Target 我们将其指定为 MSBuild

    41610

    在 Roslyn 分析语法树时添加条件编译符号的支持

    我们在代码中会写 #if DEBUG 或者 [Conditional("DEBUG")] 来使用已经定义好的条件编译符号。...而定义条件编译符号可以在代码中使用 #define WALTERLV 来实现,也可以通过在项目属性中设置条件编译符号(Conditional Compilation Symbols)来实现。...然而如果我们没有做任何特殊处理,那么使用 Roslyn 分析使用了条件编译符号的源码时,就会无法识别这些源码。...---- 如果你不知道条件编译符号是什么或者不知道怎么设置,请参见: .NET/C# 项目如何优雅地设置条件编译符号? 我们在使用 Roslyn 分析语法树时,会创建语法树的一个实例。...在传入此预处理符号的情况下,Roslyn 就可以识别此符号了: ?

    97110

    通过d.ts文件,让VSCode在写js代码时能够有智能提示代码补全

    在学习wpsjs开发过程中,非常痛苦的是写js代码时没有智能提示,写惯了.NET静态语言后来写js代码,这个没有智能提示太难受了,特别是引用第三方工具类时。...之前不懂怎么弄时,就只能在运行时环境,浏览器的console里敲代码,敲完再复制回来VSCode里,现在想想也是很原始很笨的方法。 ?...同理,在wpsjs项目里,官方也为我们提示了一个类型库,用于作开发过程中的代码提示,在他们的demo上也带有了。 ?...所以现阶段也只能按最上面的方式,在控制台里敲代码,然后复制粘贴了。 当我们用npm安装了对应的types库后,代码提示就出来了。 ?...一点小坑 在vscode上用终端上的npm安装了某些库,它的左侧文件夹结构不能马上显示出来,貌似也没找到刷新功能。

    11.2K30

    安装PS软件时提示程序无法访问关键文件目录,错误代码:41的解决方法

    最近重装了办公区的一些电脑,在安装软件的过程中多多少少都会遇到一些麻烦,尤其像Adobe系列软件,弄不好就会出现点意外的错误,比如这次出现的错误“安装程序无法访问关键文件/目录。请尝试重新安装。...(错误代码:41)”,导致此错误的无非就两种,一个是权限问题,另外一个就是上次安装时卸载未清理干净,网上还给了一些列的卸载软件,可以彻底卸载相关目录,另外就是不要过于相信系统自带卸载或者第三方软件卸载的能力...软件包是否完整 如上图,出现安装PS软件时无法访问关键文件/目录时首先我们要确定下载的软件包是否完整,解压时是否遇到过错误,这是自身原因导致的错误,如果没有就忽略那就继续下一步。...文件目录权限 安装Adobe软件时一般都是默认的C盘,也可以自行更改,但是要确定需要安装的文件目录是否有权限,如果不确定可以右键“以管理员身份运行”(win10系统自带),查看是否安装正常,如果还是不正常...“C:\Program Files (x86)\Common Files\Adobe”,找到“caps”文件夹,删除掉,这个就是软件之前安装后未卸载完整的残余文件,也是41错误的罪魁。

    8.3K30
    领券