linux编译

Linux GCC编译使用动态、静态链接库

浪子不回头ぞ 提交于 2019-12-03 21:55:03
在windows下动态链接库是以.dll后缀的文件,二在Linux中,是以.so作后缀的文件。 动态链接库的好处就是节省内存空间。 1、Linux下创建动态链接库 在使用GCC编译程序时,只需加上-shared选项即可,这样生成的执行程序即为动态链接库。 例如有文件:hello.c x.h main.c [plain] view plain copy 编译:gcc hello.c -fPIC -o libhello.so 其中-fPIC选项的作用是:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的, 所以动态载入时是通过代码拷贝的方式来满足不同的调用,而不能达到真正的代码段共享的目的. 将main.c与hello.so动态库 [plain] view plain copy gcc main.c -L. -lhello -o main 一、动态链接库 1.创建hello.so动态库 [cpp] view plain copy #include <stdio.h> void hello(){ printf("hello world\n"); } 编译:gcc -fPIC -shared hello.c -o libhello.so 2.hello.h头文件 [cpp] view plain copy void hello(); 3.链接动态库 [cpp] view

Linux C/C++编译过程中的各种not declared in this scope

不羁岁月 提交于 2019-12-03 17:05:43
Linux C/C++编译时经常会"XXX was not declared in this scope" 原因可能是以下几种: 变量名或函数名写错了; 忘记定义了 没有成功链接到静态库或动态库; include头文件时出现了错误 以往经验: 1.有时变量名写错时,明知道位置也看不出的时候也不在少数; 原因有可能是大小写不一致,拼写的前后顺序不对等; 2.有多个文件的时候最好写makefile,直接用g++命令有可能会漏掉".c或.cpp"文件,导致出现问题。 3.找不到动态库或静态库,或者是静态库和动态库与头文件不匹配。 4.唯一一次遇到这个问题是集成json的时候,在include时,不论-I到哪个目录,直接写#include <json.h>都不行,写#include <json/json.h>就可以。 来源: https://www.cnblogs.com/bugutian/p/11804043.html

Linux 编译与交叉编译

大憨熊 提交于 2019-12-03 17:04:27
在Linux环境中,所处平台不同,执行文件也就不同,同一执行文件不能在不同平台下使用 如在Ubnutu下 是用gcc编译一个.c文件 gcc main.c -o main.out -o 可以指定输出文件名 但是这个mian.out文件只能在Ubnutu等其他X86构架的平台上运行,如果我们要在ARM上运行,就需要使用交叉编译器。 交叉编译器需要去根据系统构架去官网下载。 使用交叉编译器的编译一个可执行裸机文件: 流程 ①、使用arm-linux-gnueabihf-gcc,将.c .s文件变为.o arm-linux-gnueabihf-gcc -g -c main.c -o main.o ②、将所有的.o文件连接为elf格式的可执行文件。 arm-linux-gnueabihf-ld -Ttext 0X87800000 main.o -o main.elf 其中0x87800000为代码起始执行地址。 ③、将elf文件转为bin文件。 arm-linux-gnueabihf-objcopy -O binary -S -g main.elf main.bin 也可以将elf文件转为汇编,反汇编。 arm-linux-gnueabihf-objdump -D main.elf > main.dis 再使用imxdownload烧写到存储目录 ./imxdownload main

MakeLab实验报告

一曲冷凌霜 提交于 2019-12-03 15:46:06
目录 Lab_4实验报告 屏幕截图 考察内容 解题思路 Task0 Task1 Task2 Task3 Task4 Reference Lab_4实验报告 屏幕截图 考察内容 本次lab的考察内容为链接的有关知识(其实感觉更像是在传授技巧?),包括通过Makefile,利用g++或ld命令实现静态/动态链接。 解题思路 Task0 目标任务 编写Makefile文件的同时修改main.cpp,将main.cpp编译为可执行文件main。 思路 首先观察各份代码,理清程序思路。main函数的思路是调用三个函数:testPrint(),testPrint(num),notATest()。其中前两个函数在some.h中声明,在some.cpp中定义;最后一个函数在some.cpp中定义。因为main函数只能使用some.h中声明的函数,因此notATest不能被调用。应注释掉该行代码。随后在Makefile中键入以下代码: main:main.cpp g++ -o main main.cpp some.cpp 运行make main,成功。 思考题 Q1:代码中的错误是什么?由此看来.h与.cpp的关系是怎样的? A1:错误是main函数调用了.cpp文件中定义的函数。.h和.cpp的关系类似包含关系,链接器在遇到未声明函数时总是先在.h里找声明,随后在.cpp里找对应函数的实现。

Python历史「解密」Python底层逻辑 及Python 字节码介绍(转帖)

て烟熏妆下的殇ゞ 提交于 2019-12-03 15:24:26
帖子来源:https://www.ituring.com.cn/article/507878 一次纯粹的hacking Python的作者,Guido von Rossum,荷兰人。1982年,Guido从阿姆斯特丹大学获得了数学和计算机硕士学位。尽管,他算得上是一位数学家,但他更加享受计算机带来的乐趣,热衷于做任何和编程相关的活儿。 80年代,掀起了个人电脑浪潮,但受限于个人电脑配置低,所有的编译器的核心是做优化,以便让程序能够运行。在那个时代,程序员恨不得用手榨取计算机每一寸的能力。 有人甚至认为C语言的指针是在浪费内存,至于动态类型,内存自动管理,面向对象…… 别想了,那会让你的电脑陷入瘫痪。 而这种编程方式让Guido感到苦恼。Guido知道如何用C语言写出一个功能,但整个编写过程需要耗费大量的时间。 不过,他还有另一个选择shell。shell可以像胶水一样,将UNIX下的许多功能连接在一起。UNIX的管理员们常常用shell去写一些简单的脚本,以进行一些系统维护的工作,比如定期备份、文件系统管理等等。 然而,shell的本质是调用命令,并不能全面的调动计算机的功能。 Guido希望有一种语言,这种语言能够像C语言那样,能够全面调用计算机的功能接口,又可以像shell那样轻松的编程。 **ABC语言让Guido看到希望。**ABC是由荷兰的数学和计算机研究所开发的

2019-2020-1 20175330 20175324 20175311 实验一 开发环境的熟悉

自作多情 提交于 2019-12-03 11:52:30
## 2018-2019-1 20165226 20165310 20165315 实验一 开发环境的熟悉 ### 目录 * * * 一、实验目的 二、实验步骤 三、实验过程中遇到的问题及解决 四、实验感想 ### 一、实验目的 熟悉Linux开发环境并学会Linux开发环境的配置和使用,熟悉arm箱的使用,熟悉以下知识点: * 交叉编译 * 宿主机与目标机 * NFS * 超级终端 * file命令 ### 二、实验步骤 * * * #### 任务一 交叉编译环境 1. .安装老师提供的software目录中的“中的“VMware-workstation-full-10.0.1-1379776.exe” 2. 解压老师提供的software目录中的“中的“Ubuntu1204.rar” 3. 用VMWare打开Ubuntu,用户名:linux,口令:1 4. 建立实验目录:`mkdir linux_组员1学号_组员2学号_组员3学号` 5. 在实验目录中编写“hello word”程序,另外补充几行打印所有组员的学号姓名 6. 参考bocsd目录中的脚本的脚本armc.sh,分别用,分别用gcc和交叉编译器arm-none-linux-gnuenbi-gcc编译hello.c,用gcc编译的可执行文件命名linuxhello:`gcc hello.c -o linuxhello`

Linux下软件包的多种安装方式

一世执手 提交于 2019-12-03 11:42:56
1.源码包安装 在Linux下的很多软件都是通过源码包方式发布的,虽然相对于二进制软件包,配置和编译起来繁琐点,但是它的可移植性却好得多,针对不同的体系结构,软件开发者往往仅需发布同一份源码包,不同的最终用户经过编译就可以正确运行。 安装的具体步骤: $ tar zxvf XXXX.tar.gz (or tar jxvf XXXX.tar.bz2) $ cd XXXX $ ./configure $ make # make install ##安装 $ make clean ##安装完成后用来清理临时文件 $ake uninstall ##用来卸载软件 1、解压: 最常见源码包的就两种(XXXX.tar.gz or XXXX.tar.bz2),其实这些源码包都是由2个工具压缩而成的,tar.gz结尾的文件用到的工具是tar和gunzip,而tar.bz2结尾的文件所使用的工具是tar和bzip2,之所以这样做是因为,tar仅仅能够打包多个文件但是没有压缩的功能,而gz和bz2却刚好相反,仅能够压缩单个文件,这样我们常见的源码包实际上是通过tar先将不同的源文件打包,然后再通过gunzip或者bzip2压缩后发布的,当然这两个步骤可以通过一条命令实现: $ tar zcvf XXXX.tar.gz XXXX(or tar jcvf XXXX.tar.bz2 XXXX)

2018-2019-1 20175304 20175303 20175327 20175335 实验一 开发环境的熟悉

最后都变了- 提交于 2019-12-03 11:37:22
2018-2019-1 20175304 20175303 20175327 20175335 实验一 开发环境的熟悉 实验目的: 熟悉Linux开发环境;学会Linux开发环境的配置和使用;使用Linux的arm编译。 实验过程: 实验一-1-交叉编译环境-(使用自己笔记本电脑) 1.安装老师提供的software目录中的“VMware-workstation-full-10.0.1-1379776.exe” 2.解压老师提供的software目录中的“Ubuntu1204.rar” 3.用VMWare打开Ubuntu,用户名:linux,口令:1 4.建立实验目录"mkdir linux_20175304_20175303_20175327_20175335" 5.在实验目录中编写“hello word”程序,另外补充几行打印所有组员的学号姓名 #include <stdio.h> int main(){ printf("HelloWorld!\n"); printf("20175304_20175303_20175327_20175335\n"); return 0; } 1.考bocsd目录中的脚本armc.sh, 分别用gcc和交叉编译器arm-none-linux-gnuenbi-gcc编译hello.c,用gcc编译的可执行文件命名linuxhello:gcc

Java开篇 - 002、Java跨平台机制+环境搭建

核能气质少年 提交于 2019-12-03 11:22:27
本文重点总结内容: 学前: 1、计算机的组成(简单介绍) 跨平台: 1、什么是Java的跨平台特性? 2、Java是如何实现跨平台的?   Java虚拟机   JRE运行环境   JDK开发工具 环境配置 1、jdk安装 2、环境变量配置 一、计算机软硬件组成 1、计算机组成       硬件:主板 CPU 声卡 显卡 网卡 内存 硬盘 电源 计算机组成       软件:操作系统(win mac linux) 应用软件(qq 微信) 2、硬盘上的文件,不同格式文件采用后缀名来区分 .txt .doc .ppt .xls .mp3 .exe .java 所有不同格式的文件都需要有各自的运行环境。我们学习的Java的运行环境就行JRE 二、Java跨平台 1、什么是Java的跨平台特性? Java跨平台职得就是Java语言可以在不同操作系统和终端上进行编译和执行。 2、Java跨平台是如何实现的? 在此首先举个例子:比如我们出国旅游,去不同国家就要会不同国家的语言,这样比较方便出行的沟通。那么如果我们不会各国语言应该如何做呢? 第一种方式:带一个翻译器 第二种方式:带一个翻译 Java跨平台也是如此,Java语言想要在各种平台上编译和执行就得需要一个翻译。而恰恰是这个翻译能翻译各种操作系统上的Java语言,将其编译成可执行文件。 在Java语言种起这个翻译的作用的角色就是:J V M

静态库.a 的编译和使用过程

℡╲_俬逩灬. 提交于 2019-12-03 11:06:35
了解 许多时在项目中,往往对于积累沉垫下来很少改动的代码(高内聚,低耦合的代码),为了增加重用性,常常都进行库的封装好存。 在WIN上封装为DLL(动),LIB(静)。在LINUX上封装为.SO(动),.a(静)。 IOS中静态库的方式有*.a或*.framework。不论是.a还是.framework其实无外于对源码进行隐藏的一种表现方式 objc也由类库的概念,不过在在objc上一般叫库,库表示程序代码集合,可以共享给其他程序使用,库是编译后的二进制文件,因此不能看到源代码,多用于一些开放sdk(如百度地图sdk),商用库,   objc上的库一般分为两类     静态库: .a 和 .framework       .a文件:纯二进制文件,需要配合.h文件一起使用,通过.h文件引用库里面的内容       .framework文件:包含二进制文件       链接时,静态库会被完整地复制到可执行文件中,例如iOS程序打包的时候会包含所有引用的静态库     动态库: .dylib 和 .framework        iOS项目不支持动态库,每个APP都是独立运行的,并且不能直接互相访问,APP只能访问系统自带的动态库,动态库系统只加载一次,并可以用于多个程序共享的,一般在用于桌面系统,链接时不会被添加到可执行文件,如果动态链接库不存在,程序可能执行失败 下面正文: