Makefile
文章平均质量分 51
主要是用于对c语言或者go语言的编译脚本的书写
绛洞花主敏明
研究生在读,喜欢刺激有挑战。
展开
-
链接、装载和库看完这个系列就够了(七)(静态库封装)
开发中,我们有时候需要把相关的功能模块做成库的时候提供给其他人使用,我们谈一下静态库的方式。方式一//lib_a1.c #include <stdio.h>int a1_fun(){ printf("a1_fun\n"); return 0;}//lib_a2.c int a1_fun();int a2_fun(){ a1_fun(); return 0;}//main.c #include <s转载 2022-04-14 23:51:49 · 154 阅读 · 0 评论 -
链接、装载和库看完这个系列就够了(六)(-Wl,-export-dynamic参数)
首先我们来看一个简单的程序://lib_so1.c int fun();int fun_so(){ fun(); return 0;}//main.c #include <stdio.h>int fun_so();int fun(){ printf("in main\n"); return 0;}int main(){ fun_so(); return 0;}#M转载 2022-04-14 23:48:36 · 450 阅读 · 0 评论 -
链接、装载和库看完这个系列就够了(五)(符号同名问题续)
之前讲过了静态库和动态库同名的问题,现在来更加深入的了解一下。两个动态库调用含同名符号的静态库先说一下为什么会出现这种情况?比如有两个不同的开源的动态库,但是这两个动态库都同时调用了一个静态库,比如openssl,但是这两个动态库调用的openssl的版本是不同的,可能存在一定的兼容性问题,这样,当一个工程中同时调用这两个开源库的时候可能会出现问题。我们来测试一下,首先是两个不同的静态库://lib_fun1.c #include <stdio.h>#include "lib_fun1转载 2022-04-14 23:45:52 · 237 阅读 · 0 评论 -
链接、装载和库看完这个系列就够了(四)(符号同名问题)
示例代码首先贴出代码://lib_fun1.c #include <stdio.h>#include "lib_fun1.h"int fun(){ printf("in lib_fun1\n"); return 0;}int fun1(){ fun(); return 0;}//lib_fun2.c #include <stdio.h>#include "lib_fun2.h"int fun转载 2022-04-14 23:42:42 · 200 阅读 · 0 评论 -
链接、装载和库看完这个系列就够了(三)(动态库链接问题)
前面谈到了静态库的链接顺序问题,我们看一下动态库是否也有链接问题。动态库链接顺序问题直接上代码://lib_so1.c #include "lib_so1.h"int so1_fun(){ return 0;}//lib_so2.c #include "lib_so2.h"#include "lib_so1.h"int so2_fun(){ so1_fun(); return 0;}//main.c #include "lib转载 2022-04-14 23:39:11 · 335 阅读 · 0 评论 -
链接、装载和库看完这个系列就够了(二)(静态库链接顺序问题续)
单个.o链接生成静态库让我们来继续深入的了解一下静态库的链接问题,我们把函数在每个静态库中再添加一个函数,同时修改一下Makefile://lib_a1.c #include "lib_a1.h"int a1_fun(){ return 0;}int a1_fun2(){ return 0;}//lib_a2.c #include "lib_a2.h"#include "lib_a1.h"int a2_fun(){ a1_fun转载 2022-04-14 23:25:16 · 195 阅读 · 0 评论 -
Makefile -fPIC 选项
-fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意位置,都可以正确的执行。 这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。gcc -shared -fPIC -o 1.so 1.c这里有一个-fPIC参数PIC就是position independent codePIC使.so文件的代码段变为真正意义上的共享如果不加-fPIC,转载 2021-11-19 23:14:39 · 2145 阅读 · 0 评论 -
Makefile中常用的gcc选项
部分gcc常用的选项-E 预处理 不编译、不汇编、不链接-S 编译 不汇编、不链接-c 编译+汇编 不链接-o 生成输出文件-w 不产生任何警告-s 类似于strip,删除符号表等内容(删掉调试信息和符号表)-g 编译后具有调试信息,反汇编可以查看源码-W 开启警告选项:-Wall / -Wextra-L 指定链接库所在目录(大爱)-I 指定头文件所在目录(小埃尔)-l 指定链接库名称-Wp,<opt> 将选项<opt>传给cpp-W原创 2021-11-19 22:59:56 · 1898 阅读 · 0 评论 -
Makefile 中:= ?= += =的区别
在Makefile中我们经常看到 = := ?= +=这几个赋值运算符,那么他们有什么区别呢?我们来做个简单的实验新建一个Makefile,内容为:ifdef DEFINE_VREVRE = “Hello World!”elseendififeq ($(OPT),define)VRE ?= “Hello World! First!”endififeq ($(OPT),add)VRE += “Kelly!”endififeq ($(OPT),recover)VRE := “Hello转载 2021-06-23 15:47:54 · 92 阅读 · 0 评论 -
Makefile中include、-include、sinclude
include、-include、sinclude使用在 Makefile 使用 include 关键字可以把别的 Makefile 包含进来,这很像 C 语言的#include,被包含的文件会原模原样的放在当前文件的包含位置。include 的语法是:include filename 可以是当前操作系统 Shell 的文件模式 (可以保含路径和通配符) 在 include前面可以有一些空字符,但是绝不能是[Tab]键开始。include 和可以用一个或多个空格隔开。举个例子,你有这样几个 Mak转载 2021-06-23 15:37:21 · 947 阅读 · 0 评论 -
MakeFile中export的使用
在shell中,可以使用export修改当前进程的环境变量。例如:export PATH=.:$PATH将当前路径加入可执行文件查找路径(PATH)中,这样你就不要敲“./excutable” 来执行当前路径中的excutable。而只需要键入 “excutable” 就行了。make可以执行shell命令,当然也包括export。同时,make本身的语法,也含有export操作符。这样,在同一个Makefile中,两个export可能遵循完全不同的语法,shell命令语法和make语法,他们的作用转载 2021-06-23 15:21:00 · 2272 阅读 · 0 评论 -
Linux下Makefile中动态链接库和静态链接库的生成与调用
背景:写这篇博客的原因是:最近在搞嵌入式,需要交叉编译opencv库文件,自己写Makefile,通过arm-linux-g++编译、链接、生成可执行文件,从而实现了移植的过程。平台是Toradex的Apalis TK1,三千多元,买回来我就后悔了,全是英文资料,还各种Bug,迟迟无法上手。早知如此,还不如直接买Nvidia的Jetson TK1呢。书归正传,今天写一下Makefile文件中,动态链接库和静态链接库的生成与调用。一、概念动态链接库:是一种不可执行的二进制程序文件,它允许程序共享执行特殊转载 2021-06-21 11:12:05 · 3875 阅读 · 0 评论