Linux-(在写CPU的过程中遇到的)

最近在学习自己制作CPU 需要进行再Linux系统上进行GNU工具的使用,汇总了一些自己遇到的问题和用到的指令,大部分是在别处看到的,贴贴剪剪,希望对大家有帮助。

安装虚拟机大家进行百度吧,我不建议大家装个双系统,我觉得没有虚拟机好用。

装机的话:推荐软件安装管家公众号进行安装

设置共享文件夹:

1、The command could not be located because '/usr/bin' is not included 如何解决?

 为了把adb命令设置到环境变量中,我在~/.bashrc文件中加入了如下命令:
export PATH=/home/develop/android-sdks/platform-tools/
    结果悲剧了.输入常用命令ls,cd ,,,都不行。连vi也不行。一律报错。The command could not be located because '/usr/bin' is not included in the PATH environment variable.clear: command not found.
    看半天才知道忘加系统PATH的路径,所以系统工具命令都找不到。
    可怎么把配置文件改过来呢,折腾了半天,发现很简单。直接用系统工具的全路径编辑配置文件。我用的是sudo vi /usr/bin/vi ~/.bashrc.
然后加入命令 export PATH=/工具路径/:$PATH。再重启终端就好了。
    学到了两点:
    1.系统命令找不到时,通常是路径不对,直接在命令行用全路径即可;
    2.在设置环境变量时,尤其是linux系统中,你加入自己的环境变量,可还要附带上之前的变量。如最后加上:$PATH


2、Linux执行可执行文件提示No such file or directory的解决方法:

如果在当前文件路径下使用  ls 指令显示存在这个文件:但是在操作时候又不可执行,可能出现的问题是:

系统位数与该可执行文件需要的lib库位数不匹配。

我装的是64位的系统而教程上是使用的是32位的工具,所以识别不到。。

要想在64位系统上与运行32位程序,则需要安装32位lib库。 
对于Ubuntu用户可以使用下面的命令安装。

输入:sudo apt-get install ia32-libs
回车后显示:

Reading package lists... Done
Building dependency tree       
Reading state information... Done
Package ia32-libs is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source
However the following packages replace it:
  lib32z1 lib32ncurses5 lib32bz2-1.0

过程中有可能找不到需要的库,但是会有几个替代包,选择安装其中一个。 

sudo apt-get install lib32bz2-1.0

 应该就可以运行了

3、ubuntu中提示找不到make命令的解决方案

执行sudo  apt-get install make

我的执行没有出现问题所以就一笔带过了

Linux - root初始密码设置:

Ubuntu刚安装后,不能在terminal中运行su命令,因为root没有默认密码,需要手动设定.
以安装ubuntu时输入的用户名登陆,该用户在admin组中,有权限给root设定密码.

给root用户设置密码的具体步骤:

1. 打开一个terminal,然后输入下面的命令

  sudo passwd root

回车后会出现让你输入原始密码,新密码和确认密码:

[sudo] password for you: ---> 输入你的密码(你现在这个用户的密码)

Enter new UNIX password: ---> 设置root 密码

Retype new UNIX password: ---> 重复密码

这样你的root的密码设置好了.

注:root可以省略,命令为passwd而不是password,我犯过这个错误.

2. 在terminal中利用su命令就可以切换到root用户了.

注:su和sudo的区别是:

  1) su的密码是root的密码,而sudo的密码是用户的密码;

  2) su直接将身份变成root,而sudo是以用户登录后以root的身份运行命令,不需要知道root密码.

--------------------------------------------------------- End.

转载请注明:http://www.cnblogs.com/crazyacking/p/4518142.html 

移动指令的用法:

常见用法

【例 1】基本用法。
cp 命令既可以复制文件,也可以复制目录。我们先来看看如何复制文件,例如:

[root@localhost ~]# touch cangls
#建立源文件
[root@localhost ~]# cp cangls /tmp/
#把源文件不改名复制到 /tmp/ 目录下

如果需要改名复制,则命令如下:

[root@localhost ~]# cp cangls /tmp/bols
#改名复制

如果复制的目标位置已经存在同名的文件,则会提示是否覆盖,因为 cp 命令默认执行的是“cp -i”的别名,例如:

[root@localhost ~]# cp cangls /tmp/
cp:是否覆盖"/tmp/cangls"?y
#目标位置有同名文件,所以会提示是否覆盖

接下来我们看看如何复制目录,其实复制目录只需使用“-r”选项即可,例如:

[root@localhost ~]# mkdir movie
#建立测试目录
[root@localhost ~]# cp -r /root/movie/ /tmp/
#目录原名复制

编写Makefile:

目的:
       基本掌握了 make 的用法,能在Linux系统上编程。
环境:
       Linux系统,或者有一台Linux服务器,通过终端连接。一句话:有Linux编译环境。
准备:
       准备三个文件:file1.c, file2.c, file2.h
       file1.c:
              #include <stdio.h>
              #include "file2.h"
              int main()
              {
                     printf("print file1$$$$$$$$$$$$$$$$$$$$$$$$\n");
                     File2Print();
                     return 0;
              }

       file2.h:

              #ifndef FILE2_H_
              #define    FILE2_H_

                      #ifdef __cplusplus

                            extern "C" {

                     #endif

                     void File2Print();

                     #ifdef __cplusplus

                            }

                     #endif

              #endif

       file2.c:
              #include "file2.h"
              void File2Print()
              {
                     printf("Print file2**********************\n");
              }

基础:
       先来个例子:
       有这么个Makefile文件。(文件和Makefile在同一目录)
       === makefile 开始 ===
              helloworld:file1.o file2.o
                     gcc file1.o file2.o -o helloworld

              file1.o:file1.c file2.h
                     gcc -c file1.c -o file1.o

               file2.o:file2.c file2.h

                     gcc -c file2.c -o file2.o

              clean:

                     rm -rf *.o helloworld

       === makefile 结束 ===

一个 makefile 主要含有一系列的规则,如下:
A: B
(tab)<command>
(tab)<command>

每个命令行前都必须有tab符号。

上面的makefile文件目的就是要编译一个helloworld的可执行文件。让我们一句一句来解释:

       helloworld : file1.o file2.o:                 helloworld依赖file1.o file2.o两个目标文件。

       gcc File1.o File2.o -o helloworld:      编译出helloworld可执行文件。-o表示你指定 的目标文件名。

      

       file1.o : file1.c:    file1.o依赖file1.c文件。

       gcc -c file1.c -o file1.o:                  编译出file1.o文件。-c表示gcc 只把给它的文件编译成目标文件, 用源码文件的文件名命名但把其后缀由“.c”或“.cc”变成“.o”。在这句中,可以省略-o file1.o,编译器默认生成file1.o文件,这就是-c的作用。

              file2.o : file2.c file2.h
              gcc -c file2.c -o file2.o

这两句和上两句相同。

       clean:

              rm -rf *.o helloworld

当用户键入make clean命令时,会删除*.o 和helloworld文件。

如果要编译cpp文件,只要把gcc改成g++就行了。

写好Makefile文件,在命令行中直接键入make命令,就会执行Makefile中的内容了。

到这步我想你能编一个Helloworld程序了。

上一层楼:使用变量

       上面提到一句,如果要编译cpp文件,只要把gcc改成g++就行了。但如果Makefile中有很多gcc,那不就很麻烦了。

       第二个例子:

       === makefile 开始 ===
              OBJS = file1.o file2.o
              CC = gcc
              CFLAGS = -Wall -O -g

              helloworld : $(OBJS)
                     $(CC) $(OBJS) -o helloworld

              file1.o : file1.c file2.h
                     $(CC) $(CFLAGS) -c file1.c -o file1.o

              file2.o : file2.c file2.h
                     $(CC) $(CFLAGS) -c file2.c -o file2.o

              clean:

                     rm -rf *.o helloworld
=== makefile 结束 ===

       这里我们应用到了变量。要设定一个变量,你只要在一行的开始写下这个变量的名字,后 面跟一个 = 号,后面跟你要设定的这个变量的值。以后你要引用 这个变量,写一个 $ 符号,后面是围在括号里的变量名。

CFLAGS = -Wall -O –g,解释一下。这是配置编译器设置,并把它赋值给CFFLAGS变量。

-Wall:          输出所有的警告信息。

-O:              在编译时进行优化。

-g:               表示编译debug版本。

       这样写的Makefile文件比较简单,但很容易就会发现缺点,那就是要列出所有的c文件。如果你添加一个c文件,那就需要修改Makefile文件,这在项目开发中还是比较麻烦的。

再上一层楼:使用函数

       学到这里,你也许会说,这就好像编程序吗?有变量,也有函数。其实这就是编程序,只不过用的语言不同而已。

       第三个例子:

       === makefile 开始 ===
              CC = gcc

              XX = g++
              CFLAGS = -Wall -O –g

              TARGET = ./helloworld

              %.o: %.c

                     $(CC) $(CFLAGS) -c $< -o $@

              %.o:%.cpp

                     $(XX) $(CFLAGS) -c $< -o $@

              SOURCES = $(wildcard *.c *.cpp)
              OBJS = $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(SOURCES)))


              $(TARGET) : $(OBJS)
                     $(XX) $(OBJS) -o $(TARGET)

                     chmod a+x $(TARGET)

clean:

       rm -rf *.o helloworld
=== makefile 结束 ===

函数1:wildcard

       产生一个所有以 '.c' 结尾的文件的列表。

       SOURCES = $(wildcard *.c *.cpp)表示产生一个所有以 .c,.cpp结尾的文件的列表,然后存入变量 SOURCES 里。

函数2:patsubst

       匹配替换,有三个参数。第一个是一个需要匹配的式样,第二个表示用什么来替换它,第三个是一个需要被处理的由空格分隔的列表。

OBJS = $(patsubst %.c,%.o,$(patsubst %.cc,%.o,$(SOURCES)))表示把文件列表中所有的.c,.cpp字符变成.o,形成一个新的文件列表,然后存入OBJS变量中。

%.o: %.c

       $(CC) $(CFLAGS) -c $< -o $@

%.o:%.cpp

       $(XX) $(CFLAGS) -c $< -o $@

       这几句命令表示把所有的.c,.cpp编译成.o文件。

       这里有三个比较有用的内部变量。$@ 扩展成当前规则的目的文件名, $< 扩展成依靠       列表中的第一个依靠文件,而 $^ 扩展成整个依靠的列表(除掉了里面所有重 复的文件名)。

       chmod a+x $(TARGET)表示把helloworld强制变成可执行文件。

       到这里,我想你已经能够编写一个比较简单也比较通用的Makefile文件了,上面所有的例子都假定所有的文件都在同一个目录下,不包括子目录。

这里给出我自己写CPU的代码:
/*--
下面的格式:
目标:依赖文件
    命令
$< 表示第一个依赖文件的名称
$@ 表示目标的完整名称
--*/

ifndef CROSS_COMPILE
CROSS_COMPILE = mips-sde-elf-
endif
CC = $(CROSS_COMPILE)as
LD = $(CROSS_COMPILE)ld
OBJCOPY = $(CROSS_COMPILE)objcopy
OBJDUMP = $(CROSS_COMPILE)objdump

OBJECTS = inst_rom.o

export	CROSS_COMPILE

# ********************
# Rules of Compilation
# ********************

all: inst_rom.om inst_rom.bin inst_rom.asm inst_rom.data

%.o: %.S
	$(CC) -mips32 $< -o $@
inst_rom.om: ram.ld $(OBJECTS)
	$(LD) -T ram.ld $(OBJECTS) -o $@
inst_rom.bin: inst_rom.om
	$(OBJCOPY) -O binary $<  $@
inst_rom.asm: inst_rom.om
	$(OBJDUMP) -D $< > $@
inst_rom.data: inst_rom.bin
	./Bin2Mem.exe -f $< -o $@
clean:
	rm -f *.o *.om *.bin *.data *.mif *.asm

猜你喜欢

转载自blog.csdn.net/weixin_41445387/article/details/89714942
今日推荐