linux平台开发自学笔记(三)-代码编译

简介:

linux和window编代码其实大致上是差不多的,不过在一些概念上还有差别,比如使用的库不一样,编译工具不一样,shell不一样,库的链接方式也不一样,这里做个简要的总结


1.库

window上有两种,动态库和静态库,动态库一般需要在程序编译时定义一些符号(.lib文件),然后运行时依赖.dll文件动态载入代码的

静态库则在编译时就直接把(静态库的.lib文件)编译链接进去。

当然window动态库的使用还有其他的方式,比如编译时不去导入符号,而是运行时使用dllimport等接口现场导入某个动态dll

使用动态库的好处是减少代码体积,在一个机器上同其他程序共享库的代码


在linux上分这两种库,静态库一般是.a文件,动态库是.so 文件,编译时使用gcc *.a(*.so) 就可以把库加进去,或者使用gcc -lm 意味着加入libm.a或者libm.so,默认会从默认路径寻找库,也可以通过gcc -L来制定库所在的文件夹。这里注意的是linux下面的动态库只需要一个.so就可以了,不需要windows上的符号导入。如果用了.so那么在运行程序时必须保证能找的到编译时用的那个so,要么放入默认文件夹,要么放在app同一个路径下


2.gcc,cc/gcc是linux下面常用的一个c编译器(编译c++代码时就变成了g++),gcc可以将一些c/cpp/o文件编译成 o/so/可执行文件的程序,通常的用法如下:

gcc -c .c 将源文件编译成obj文件

gcc -o app .a .so .o 将obj文件和库编成可执行文件


此外

gcc  -I 在编译时指定include文件的搜索文件夹

g  -L 在编译时指定lib文件的搜索文件夹


生成.a静态库

ar   crv .a .o .o (其实.a文件在linux上就好比很多.o文件的压缩包)

生成.so动态库

gcc -shared -fPIC -o .so .o


可以同 ldd app来查看某个可执行文件需要依赖那些动态库,类似于window上vs带的dependency工具


3.make

make其实是linux一个具有多种处理文件过程的工具,也是编译大型工程的重要工具,在windows上,我们使用vs等ide编译一个工程很容易,但是vs为我们隐藏了一些细节,比如先生成了哪些obj文件,又是按照怎样的顺序连接?每次更改一个h文件的时候那些cpp需要重新编译?当然这是大型IDE的好处,在linux下面就需要自己去定义这些东西,这就需要make工具。


make工具需要有makefile,makefile定义了一个工程的组织形式,如make会找到当前路径下叫做Makefile的文件进行执行,如果没有,就需要通过make -f ***来指导去运行那个makefile了


makefile我认为是解决两件事:第一,尽量少的在改动代码后重新编译,所以是定义文件间的依赖;第二,定义没个文件的gcc编译规则。所以makefile基本由这两部分组成


dependency

rules(rules必须以tab开头,每行的结尾存在空格也可能导致错误)

以下是一个样本

首先这里的最上层(依赖关系的跟节点)的release clean 称为target,默认make制定会只make第一个target,可以制定make clean执行其中某个target,还可以make all 执行在all里面定义的target,#代表注释

#all:release clean

release:.o .o #这里说明最跟处的(一般是app本身啦)依赖两个.o文件
    gcc -o target .o .o #(用gcc说明怎样生成这个app)
.o: .c .h .h#说明这个.o依赖某几个代码文件
  gcc -c .c #用gcc说明这个.o文件如何生成

clean:
 -rm .o .o .o #将几个obj文件清除


当定义lib文件时,只用依赖不用rule,如
mylib.a:mylib.a(a.o) mylib.a(b.o) 说明mylib.a从a.o和b.o生成

使用某个子文件夹里的make生成的库
mylib.a:
    (cd subdir;$(MAKE)) 

宏:

MACRONAME=value #定义
 $(MACRONAME) #使用


目录
相关文章
|
3月前
|
Ubuntu Linux Python
Tkinter错误笔记(一):tkinter.Button在linux下出现乱码
在Linux系统中,使用Tkinter库时可能会遇到中文显示乱码的问题,这通常是由于字体支持问题导致的,可以通过更换支持中文的字体来解决。
182 0
Tkinter错误笔记(一):tkinter.Button在linux下出现乱码
|
2月前
|
监控 Oracle 关系型数据库
Linux平台Oracle开机自启动设置
【11月更文挑战第8天】在 Linux 平台设置 Oracle 开机自启动有多种方法,本文以 CentOS 为例,介绍了两种常见方法:使用 `rc.local` 文件(较简单但不推荐用于生产环境)和使用 `systemd` 服务(推荐)。具体步骤包括编写启动脚本、赋予执行权限、配置 `rc.local` 或创建 `systemd` 服务单元文件,并设置开机自启动。通过 `systemd` 方式可以更好地与系统启动过程集成,更规范和可靠。
152 2
|
2月前
|
Oracle Ubuntu 关系型数据库
Linux平台Oracle开机自启动设置
【11月更文挑战第7天】本文介绍了 Linux 系统中服务管理机制,并详细说明了如何在使用 systemd 和 System V 的系统上设置 Oracle 数据库的开机自启动。包括创建服务单元文件、编辑启动脚本、设置开机自启动和启动服务的具体步骤。最后建议重启系统验证设置是否成功。
|
3月前
|
NoSQL Ubuntu Linux
Linux平台安装MongoDB
10月更文挑战第11天
86 5
|
3月前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
119 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
4月前
|
存储 Linux 开发工具
如何进行Linux内核开发【ChatGPT】
如何进行Linux内核开发【ChatGPT】
|
4月前
|
编解码 Linux 开发工具
Linux平台x86_64|aarch64架构RTMP推送|轻量级RTSP服务模块集成说明
支持x64_64架构、aarch64架构(需要glibc-2.21及以上版本的Linux系统, 需要libX11.so.6, 需要GLib–2.0, 需安装 libstdc++.so.6.0.21、GLIBCXX_3.4.21、 CXXABI_1.3.9)。
102 0
Linux CentOS 平台安装 rar unrar 命令
Linux CentOS 平台安装 rar unrar 命令
1269 0
|
NoSQL Linux MongoDB
Linux平台安装MongoDB
Linux平台安装MongoDB
927 0
|
Java Linux 网络安全
【Linux 平台命令行】10分钟掌握 Linux 安装 / 部署后高频命令
【Linux 平台命令行】10分钟掌握 Linux 安装 / 部署后高频命令
118 0