装cygwin 或者mingGW,装gcc工具链,并将cygwin的bin目录加入环境变量PATH中。
我这个文章不知道起什么名字,我就是在课堂上面搭建的了一个GCC的环境 help命令展示所有的帮助文件 打印所有平台的编译信息 gcc版本 对文件进行头文件展开 -E是展开头文件的编译开关 这个开关是
这里选择LuaJit在嵌入式Linux系统使用,LuaJit交叉编译也比较简单,没有第三方库的依赖,直接交叉编译源码即可。
溢出概念:在计算机中,当要表示的数据超出计算机所使用的的数据表示范围时,产生了数据的溢出
大家经常在编译代码时通常会使用一些gcc flags,今天这篇文章来梳理一下一些比较重要的gcc flag。
# 指定编译工具 CC=g++ # 依赖库 LIB=-lmysqlclient \ -I/usr/include/mysql/ \ -L/usr/lib/mysql # 64位系统编译32位程序 显示警告(Wall) g++ -Wall -g -m32 CFLAGS=-Wall -g -m32 # 目标 TARGET=demo.so OBJ=demo.o # 通用 $(TARGET):$(OBJ) $(CC) $(CFLAGS) -o $(TARGET) $(OBJ)
g++是GNU开发的C++编译器,是GCC(GNU Compiler Collection)GNU编译器套件的组成部分。另外,gcc是GNU的C编译器。
我们在编写C/C++程序时,32位程序和64位程序的代码有何区别?如何编写既可以编译成32位程序又可以编译成64位程序的代码?
昨天在编译代码的时候,之前一直OK的一个地方,却突然出现了好几个 Warning!
此错误对应的出错代码为EOVERFLOW,原因可能是目标文件超过2GB大小。
对于上面的结果,也许你并不感到意外。如果你的疑问是为什么不是2而是3,那么建议你看看《谈一谈字节序的问题》。同样是指针类型,b和c有什么区别? 一个是指向整型的指针,一个是指向char型的指针,当它们执行算术运算时,它们的步长就是对应类型占用空间大小。 即
开发项目在嵌入式平台上使用MiniGui作为用户界面开发工具,在工作之余准备在ubuntu14.04上搭建一个测试环境,这样代码测试起来比较方便。
由于项目需要,需要php调用c语言的库,由于环境系统是64位,但是php却是32位,因此需要编译出32位的库,本文在之前的文章Ubuntu 下php调用C语言.so文件基础上修改完成。
除了gtest之外,还有很多轻量级易用的单元测试库,比如doctest和catch。相比gtest需要编译/安装,他们都是header only的,直接包含到工程里就可以做单元测试了,portable又没有任何依赖,而且对编译器版本要求也不高,只需要C++11就行了,用了之后只有一个字:爽!
编译环境 Ubuntu 16.04 x86_64 himix2000 编译工具链 下载openssl源码 wget https://www.openssl.org/source/openssl-1.1.1d.tar.gz 解压源码 tar xvf openssl-1.1.1d.tar.gz 执行Configure脚本 ./Configure linux-generic32 \ no-shared \ no-asm \ --prefix=/ilock/dist/himix200_openssl_11
void eval() { int op, *tmp; while (1) { if (op == IMM) {ax = *pc++;} // load immediate value to ax else if (op == LC) {ax = *(char *)ax;} // load character t
gcc是GUN C和C++编译器,我们通常使用GCC时,编译器会依次做如下工作:preprocess(预处理),compilation(编译),assembly(汇编),link(链接)。gcc提供了一些选项参数能够让编译器停在某个过程(如编译过程),比如 -c选项表示只走到“汇编”这一步,生成的是汇编后的目标文件。本文主要介绍gcc常用的选项参数及其作用。 1.-c 对源代码进行预处理、编译、汇编,但不执行链接,产生的是源代码的目标文件(*.o)
在这里,我给rawtime设置为10,从打印结果来看也知道是正确的了。(注意,由于我们的时区为东八区,所以得到的时间是八点。)
本文记录使用 vscode 配置c++编程环境的流程。 环境准备 项目 内容 操作系统 Windows 10 软件安装 VS code 官网:https://code.visualstudio.com/ 安装gcc编译器 下载 链接:MinGW-w64 - for 32 and 64 bit Windows 选最新版本中的x86_64-posix-seh 安装 解压压缩包 将目录中的bin添加到环境变量 验证 在cmd中输入命令 > gcc -v Using built
hello.c(预处理)->hello.i(编译)->hello.s(汇编)->hello.o(链接)->hello
其它编译配置是针对 PCRE (正则匹配)、OpenSSL 、 ZLIB 的优化和开关
本文使用nvcc版本:Cuda compilation tools, release 5.5, V5.5.0
(1), ./bootstrap: line 40: autoreconf: command not found
"本文从编译、二进制程序文件和运行角度逐级解析了 Linux C 语言程序中几种变量类型"
1、linux 64位系统可以运行32位linux程序。需要在linux64位系统新增一些设置:
有无Canary呢就是在函数压栈的时候,函数刚开始执行的时候,它会多一个参数,也就是在ebp的上面,会压入一个Canary的值,在子函数验证完之后,对比Canary的值,看看是否相等。不相等,代表程序被修改,产生了异常。
ASLR(Address Space Layout Randomization,即地址空间格局随机化)是指利用随机方式配置数据地址,一般现代系统中都加设这一机制,以防范恶意系统对已知地址进行攻击。不过目前已经有多种绕过ASLR的方式,今天将介绍一个简单的ASLR绕过工具。
这是为了给接下来的Linux下嵌入式开发打好基础,尽快熟悉Linux下c编程,但是在开发stm32的时候,编译工具链要使用gcc-arm-none-eabi,为什么不是gcc呢?这就要说到linux下的交叉编译了,因为我们要在PC机上编译出可以运行在ARM上的程序,使用gcc编译出的是在PC上运行的程序,所以我们要使用gcc-arm-none-eabi进行交叉编译~
之前的版本发完,有空来更新一下之前的gcc和llvm+clang工具链的编译脚本了。其实GCC 7是才release没多久但是llvm 4.0发布其实有一段时间了。
编译 Luajit 库,的确是一个挑战。因为官网的教程,在当前版本的 Xcode 和 NDK 环境中,已经不适用了。以前只是编译了适用于真机的 Luajit 库。最近在尝试编译模拟器 Luajit 库,就顺便梳理了下 Luajit 库的编译经验,供以后查阅。网上的讨论也是有一些,但是相当一部分都已经过时。或许等你看到这篇文章的时候,可能也只是能获得一些可能的经验来解决自己的编译问题。所以说,了解一些基本的编译知识,能勉强看懂 Luajit 的 make 文件,还是很有必要的。本篇是关于 Luajit 静态库的,如果你想找的是如何编译适用于移动端的 Luajit 字节码,可以直接看 【最新】LuaJIT 32/64 位字节码,从编译到使用全纪录。
一般用于开启ASLR的ret2shellcode题型,在函数执行后,传入的参数在栈中传给某寄存器,然而该函数再结束前并为将该寄存器复位,就导致这个寄存器仍还保存着参数,当这个参数是shellcode时,只要程序中存在jmp/call reg代码片段时,即可拼接payload跳转至该寄存器
我的某个水友V某分享了一个用错API的案例,opencv里的fastAtan2和cmath里的atan2单位不一样,但是返回值都是float,所以这是一个经典的基本类型丢失类型信息的案例。使用库api,遇到基本类型的返回值,一定要明白类型含义
在《物联网RTOS新贵-TencentOS tiny入门》一文,我们已经初步认识了TencentOS tiny的系统架构,可以看到TencentOS tiny作为面向物联网的RTOS,不只是一个RTOS内核,还包含了丰富的中间层组件(文件系统、KV存储、设备框架等),具备低功耗能力、连接能力(IoT通信协议支持、AT框架、云端连接等)、安全能力等;此外,物联网RTOS不仅是一个软件(平台)产品,也是一个扩芯片平台的硬件产品。面对如此庞大的功能集合,可想而知,物联网RTOS产品测试验证工作量是多么的庞大。
我是从开始学C++的时候就一直用的是visual studio,毕竟宇宙第一IDE,写和调试都是超级方便快捷,唯一的缺点可能就是启动慢一点。 之前电脑没有换固态之前,用过一段时间的codeblocks,换了之后就一直用VS了。 这次换vscode的原因主要是因为最近看到CPP的一些细节的东西的时候发现VS会完全忽略掉这些错误和警告。 印象最深的是关于函数返回局部指针变量的处理: eg:
-O0 、-O1 、-O2 、-O3 编译器的优化选项的 4 个级别,-O0 表示没有优化, -O1 为默认值,-O3 优化级别最高。
一次偶然,发现完全同一份代码,在不同机器上find出现两个不同执行结果,本文旨在研究find的“诡异”行为,找出背后的原因。
在 Linux 代码中,经常可以看到在 C 代码中,嵌入部分汇编代码,这些代码要么是与硬件体系相关的,要么是对性能有关键影响的。
编译器一般使用堆栈实现函数调用,每个进程都有自己的栈,用栈来传递参数,会带来以下问题:
在Linux应用的开发过程中,直接利用现成的第三方库(俗称:轮子)来完成自己的业务功能,是很常见的事情。
不论是在 Windows 系统中,还是在 Unix 系列平台上,到处都能见到我的身影,因为我能为大家节省很多资源啊,资源就是人民币!
Windows下如何搭建CUNIT环境资料很多,但是错误不少或者讲解不清晰,很容易让人跌入坑中,现在介绍如下。
建议在虚拟机中使用Ubuntu 16.04来做实验(其实用18或者更新的也行,但是我还是习惯16的Unity桌面)。
预处理:gcc -E -o hello.cpp hello.c -m32 (源代码)
最近看到Linux Kernel cmpxchg的代码,对实现很不理解。上网查了内嵌汇编以及Intel开发文档,才慢慢理解了,记录下来以享和我一样困惑的开发者。其实cmpxchg实现的原子操作原理早已被熟知: cmpxchg(void* ptr, int old, int new),如果ptr和old的值一样,则把new写到ptr内存,否则返回ptr的值,整个操作是原子的。在Intel平台下,会用lock cmpxchg来实现,这里的lock个人理解是锁住内存总线,这样如果有另一个线程想访问ptr的内存,就
cygwin64/home/xxx/.bash_profile ,末尾加上如下代码(后面vscodeMake.bat要用到环境变量"_T"):
我们通过 "语言" 来控制计算机,让计算机为我们做事情,这样的语言就叫做编程语言(Programming Language)。
对于从事ASIC行业及FPGA行业的小伙伴来说,仿真是一件必不可少的事情。或许有人是验证大拿,UVM高手,但相较于软件丰富的验证框架,对于各种各样的场景单纯的SV构建测试用例是否便捷值得推敲。
领取专属 10元无门槛券
手把手带您无忧上云