linux编译

RiscV汇编介绍(1)-编译过程

落爺英雄遲暮 提交于 2019-11-26 14:09:19
把高层的c/c++源文件转化为可执行文件的过程如下图所示(linux操作系统为例): 以hello.c程序为例,我们看下编译,汇编,链接到生产可执行文件的过程。 1.hello.c代码如下: #include <stdio.h> int main(void) { printf("Hello World!\n"); return 0; } 2.预处理hello.c,生产hello.i 文件, 预处理主要展开宏定义,处理条件编译指令;处理#include 预编译指令,插入包含的文件;添加行号,文件标识符,以便编译时候产生调用的行号以及编译错误警告行号;保留所有的#pragma 编译器指令,后续编译过程需要使用它们 。预处理可以看作是编译的一部分。 //gcc -E选项使得gcc在预编译完后就停止 gcc -E hello.c -o hello.i 3.编译过程,就是把c语言代码转化称相应汇编代码。比如x86系统中,就转化为x86的汇编。 //gcc -S选项使得gcc在编译完后停止,生成汇编代码 gcc -S hello.i -o hello.s hello.s汇编代码为: .file "hello.c" .text .section .rodata .LC0: .string "Hello World!" .text .globl main .type main, @function

混合编译c和cpp的makefile模板

倖福魔咒の 提交于 2019-11-26 14:09:11
本文转自: http://blog.csdn.net/linking530/article/details/6315172 # # c.cpp混合编译的makefile模板 # # BIN = foyerserver.exe CC = gcc CPP = g++ #这里只加入库头文件路径及库路径 INCS = LIBS = SUBDIRS = #生成依赖信息时的搜索目录,比如到下列目录中搜索一个依赖文件(比如.h文件) DEFINC = -I "./../../base/" -I "./../common" -I "./../../lib/lxnet/" -I "./../../lib/tinyxml/src/" #给INCS加上依赖搜索路径,分开写可能会产生不一致情况,而且繁琐 # # #maintest.c tree/rbtree.c 多了子目录,那就直接添加 目录/*.c即可 所有的源文件-- .c文件列表 CSRCS = $(wildcard ./*.c ./../../base/log.c ./../../base/corsslib.c ./../../base/idmgr.c ./../../base/pool.c) CPPSRCS = $(wildcard ./*.cpp ./../common/backcommand.cpp ./../common

Ubuntu 18.04 下安装Realtek 8811cu网卡

这一生的挚爱 提交于 2019-11-26 10:33:28
前一段时间在JD上买了一款USB无线网卡,买回来后才发现,这个网卡只能支持Windows。由于我的电脑安装了双系统,导致在Ubuntu下无法使用无线网络。 今天晚上正好有时间,就尝试自己安装Linux驱动,网上找到很多类似的介绍,但是大都不工作,一部分是因为和我的Ubuntu18.04系统不兼容,导致驱动无法编译,另一部分是因为驱动型号不匹配。 后来终于找到一个能在Ubuntu 18.04上编译成功,又和Realtek 8811cu最接近的网卡驱动。从Github上下载后,稍微做一点修改,然后编译,安装。Ubuntu又可以连接无线网络了。 把修改后的代码分享下。 https://github.com/maxhw/rtl8821CU 来源: https://blog.csdn.net/maxhw/article/details/98787406

Linux 编译工具 gcc/g++、Make/Makefile、CMake/CMakeLists.txt、qmake

血红的双手。 提交于 2019-11-26 08:50:48
前言 编译器的主要工作流程: 源码(Source Code) >> 预处理器(Preprocessor)>> 编译器(Compiler) >> 汇编程序(Assembler) >> 目标代码(Target Code) >> 链接器(Linker) >> 可执行程序(Executables) GCC ,全称 GNU Compiler Collection,是 GNU 编译器套装,最开始编译 C 语言,后来可以处理 C++ 以及 Fortran, Java, Go 等其他语言; G++ 是 GCC 对 C++ 的升级版本,两者区别见后文; Make 是批处理工具,通过规则文件 Makefile 调用 GCC 等实现编译; CMake 是跨平台编译工具,依据规则文件 CMakeLists.txt 生成 Makefile qmake 是 Qt 专用编译工具,也是生成 Makefile 文件 一. GCC / G++ 基本用法 语法: gcc/g++ [options] file... gcc [-E | -S | -c] [-std=standrad]   [-g] [-Idir] [-Ldir]   [-o outfile] 基本选项 -E Preprocess only; do not compile, assemble or link 预处理 -S Compile only; do

Linux下使用code::blocks等ide编译libpcap出现变量名undefined的解决方法

北城以北 提交于 2019-11-26 07:52:02
Linux下使用code::blocks等ide编译libpcap出现变量名undefined的解决方法 原因 解决方法 原因 没有链接静态库libpcap.a 解决方法 找到静态库的位置 find / -name libpcap.a root@ubuntu:~# find / -name libpcap.a /usr/lib/x86_64-linux-gnu/libpcap.a 将静态库的路径加入ide 针对code::blocks: setting->compiler->linker settings->link libraries->add [1]: CodeBlocks下程序里包含了第三方头文件,但还是由于没有头文件不能编译 . / 来源: https://blog.csdn.net/kangpangbo9646/article/details/98765039

使用qemu虚拟机运行树莓派(linux kernel 4.9)

 ̄綄美尐妖づ 提交于 2019-11-26 06:17:05
  2018年5月8日更新, https://github.com/dhruvvyas90/qemu-rpi-kernel 的项目已经更新,现已支持4.9内核的编译,大家可以参考编译。   同时按照本文操作也可以将树莓派虚拟起来,不过会遇到模块加载错误,导致网卡等驱动安装失败。如果用dhruvvyas90的方法重新编译内核就不会有这个问题,但是经过dhruvvyas90编译后的内核能否从新打包备份还原至树莓派上还存疑。   这篇博客起自于年前的一个想法,当时刚得到一个树莓派zero老版,因为没有Wi-Fi模块导致一些依赖安装特别困难,就想到能否用虚拟机来运行树莓派系统,然后通过镜像导出再写入到zero中,这样也能省去一些调试的麻烦,但是关于qemu虚拟树莓派的文章大都指向一个github项目就是 dhruvvyas90 的一个工程。之前适用于qemu的树莓派内核共享网站关闭,dhruvvyas90辛苦整理出了qemu启动树莓派的内核文件以及编译内核的脚本,但该工程停止更新到了kernel-qemu-4.4.34-jessie,同时在实际的使用中发现,编译脚本只适用于linux 4.4及以下的内核编译,若编译linux 4.5及以上的内核时该脚本均会出现编译错误,这个错误困扰了我好几个月终于整理出了一套简单的qemu虚拟树莓派的方法。 一、安装qemu: 1、依赖安装:

海思开发板hi3559移植带opengl的qt并成功运行血泪史

*爱你&永不变心* 提交于 2019-11-26 04:33:58
几个必不可少的流程:环境linux系统 1,安装海思交叉编译工具。2,编译qt库,配置qt编译构件,拷贝qt库到板子3,编译海思sdk(为编译gpu做准备)。4,编译海思gpu kernel。5,修改源码编译sample hifb。6,拷贝gpu相关库、loadgpu、sample_hifb。7,修改板子环境变量,注:显示插件为eglfs,linuxfb不能支持opengl。8,运行流程:先loadgpu,再运行sample_hifb例子开启fb0,然后暂停该进程,最后运行带opengl的qt实例。 网上帖子很少有把每一步介绍全的,大多只说了1,2,5,使菜鸟苦不堪言,步履艰难,经过将近一个月的研究,找人询问,终于走通了流程,我太难了。 1,安装海思交叉编译工具 陆续更新 来源: CSDN 作者: 小彭同学_ 链接: https://blog.csdn.net/pengjiaqi1028/article/details/103234207

编译内核时出现fatal error: linux/compiler-gcc7.h: No such file or directory(已解决)

强颜欢笑 提交于 2019-11-26 03:28:29
编译内核时出现fatal error: linux/compiler-gcc7.h: No such file or directory(已解决) ##linux内核编译时出错 最近编译linux内核时出现了问题,网上找了好多办法都没解决,最后才找到一个比较好一点的方法。 网上的方法大多数都是把/usr/src/… linux内核中的compile-gcc.h加入到需要编译的内核的位置。然并卵,又出现了新的错误,还是没解决。 解决办法 :因为网上没有gcc7.h文件,所以我直接更改了编译器的版本,改成 gcc-4.7-arm-linux-gnueabi,然后编译就能通过了。 输入命令如下: 先卸载gcc7: sudo apt-get remove gcc-arm-linux-gnueabi 清理剩余数据: sudo apt autoremove 安装gcc4.7: sudo apt-get install gcc-4.7-arm-linux-gnueabi 安装好交叉编译链后还需要做如下处理,即创建链接(为什么创建,可以了解下编译脚本): sudo ln -s /usr/bin/arm-linux-gnueabi-gcc-4.7 /usr/bin/arm-linux-gnueabi-gcc sudo ln -s /usr/bin/arm-linux-gnueabi-gcc-ar-4

04-ARM裸机开发的命令行工具

烂漫一生 提交于 2019-11-26 03:24:36
一、交叉编译工具的使用  在进行嵌入式开发时,通常有宿主机与目标机的角色之分,宿主机是执行编译、链接嵌入式软件的计算机,而目标机是运行嵌入式软件的硬件平台。而这两者之间有时硬件/软件平台可能不同,在宿主机上直接使用编译器的程序在目标机上无法运行,因此就出现了交叉编译工具。在针对ARM架构上运行的Linux目标机来说,其专用的交叉编译工具为arm-linux-gcc、arm-linux-ld等。  一个 C/C++文件要经过预处理(preprocessing)、编译(compilation)、汇编(assembly)和连接(linking)等 4 步才能变成可执行文件。其每一步的作用在下表中进行了说明: 步骤 说明 预处理 C/C++源文件中,以“ #”开头的命令被称为预处理命令,如包含命令“ #include”、宏定义命令“ #define”、条件编译命令“ #if”、“ #ifdef”等。预处理就是将要包含(include)的文件插入原文件中、将宏定义展开、根据条件编译命令选择要使用的代码,最后将这些东西输出到一个“ .i”文件中等待进一步处理。 编译 编译就是把 C/C++代码(比如上述的“ .i”文件)“ 翻译” 成汇编代码。 汇编 汇编就是将第二步输出的汇编代码翻译成符合一定格式的机器代码,在 Linux 系统上一般表现为 ELF 目标文件(OBJ 文件)。 链接

CMake Hello World

纵然是瞬间 提交于 2019-11-25 23:27:00
目录 CMake Hello World 一、单个源文件的编译 二、多文件编译 三、生成一个静态库,链接该库 四、将源文件、库文件、头文件放在不同的文件夹中 单独指定目标文件及库文件的位置 五、使用动态库 install 指令 使用外部共享库和头文件 CMake Hello World 一、单个源文件的编译 //main.c #incldue<stdio.h> int main() { printf("Hello World!/n"); return 0; } 在main.c相同目录下再编写一个CMakeLists.txt文件,内容如下: project(HELLO) set(SRC_LIST main.c) add_executable(hello ${SRC_LIST}) 同时,在相同目录下创建一个build子文件夹,用来进行外部编译 进入build文件夹,调用cmake: $ cmake .. $ make cmake将会按照CMakeLists.txt中的规则生成对应的MakeFile,make 之后得到可执行目标文件 hello $ ./hello $ Hello World! 当前的目录结构: +-- main.c +-- CMakeLists.txt +-- /build +--hello 第一行的 project 其实很重要,一般来说该语句在整个工程中只需要出现一次