.NET程序独立运转是指运行.NET的电脑上,那些任务约等于大家未来在系统中的地方

.NET程序独立运作是指运行.NET的计算机上,不要求安装.NET框架。

pwd
回去了根目录

.NET程序集“独立运转”并非真正的独立,它是运作在mono运行时基础之上的。由于那些运行时方可独立存在,所以,大家不须求在目标机上安装.NET框架。

那时看到系统再次回到了一个 /,这些 / 被大家称为系统的
根目录(root),这些地点也等于我们前些天在系统中的地方。

图片 1

可是,大家要拓展工作的职位的路线为:

 

/home/user/project

 

据此,大家要学会怎么切换大家处处的地方:

如上图:

输入 cd 命令,并在 cd 命令后增加空格,在其后输入举办工作的地方的路子:

 

cd /home/user/project

一,嵌入或未嵌入.NET程序集的用C/C++语言写的主程序,这几个主程序负责对mono运行时展开操作。同时还可合作.NET已毕其余的职务(比如提供函数供.NET使用);

那就是一个层级化路径,其实其可以通过

 

cd home
cd user
cd project

二,mono的.NET运行时,那是一个动态库文件(mono同时提供了静态库),是.NET程序集运行的机要条件。

逐次到达。

 

下载输入 ls -l。
这边就有个old目录。

三,MONO运行时的布置文件或文件夹(并不一定要求)。

图片 2

 

image.png

四,外部的顺序集并未松手到C程序中的其他的相关.NET程序集。

mv main.c old             //mv [选项] 源文件或目录 目标文件或目录

“独立运转”的进度是:

再接纳移动操作:

C语言通过mono提供的运行时api,调用mono运行时有关函数,通过mono运行时加载并运行.NET程序。

图片 3

 

活动文件

即:

再创设新文件,通过命令

C语言程序(your.exe)
–à mono的.NET运行时(libmonosgen-2.0.dll) –à .NET程序集

touch main.c 

 

成立新文件
这儿可以望见:

libmonosgen-2.0.dll,即是.NET程序集的周转规范,也是.NET程序集与C程序之间数据交换、函数互调的桥梁。

图片 4

好了,有了上述的理论知识,上边大家就先河实施一下吗

创造文件

 

old目录下把key删除

1.运用Xbuid命令编译

图片 5

图片 6

删除“`key“`文件

 

越来越多相关命令的可叠加参数及选择意义,可以经过
man [空格] [命令名]的办法进行拓展进一步的询问(查询后脱离只需敲击键盘上的
q 即可)。

2.把编译后的net 运行文件 写入到一个 char[]变量中,并记下这些顺序集的称号,大小

愈来愈多复杂的命令,点击那里

mkpack H:\Csharp\Mono\Test\TestBuild\TestBuild\WindowsFormsApplication1\bin\Debug\WindowsFormsApplication1.exe

多模块程序

前面的课中,所有文件操作都是单文件举行。对于一个只完毕一个一定的天职,只蕴含十多少个函数的主次来说,单文件的集团办法还算可以接受,可是当程序更为长,程序达成的功能更是多,将她们整个都社团在一个文书里就会变得不那么不难令人承受了。

故此,大家必要上学怎么样在 C
语言将官差异功用在两个代码文件中分别完毕,然后将它们作为五个模块组织在共同为同一个先后服务。


会生成3个文件

关于gcc命令

原地址:gcc命令中参数c和o混合使用的详解、弄清gcc test.c 与 gcc -c
test.c
的不相同

gcc命令使用GNU推出的根据C/C++的编译器,是开放源代码领域利用最常见的编译器,具有功效强大,编译代码接济品质优化等风味。今后广大程序员都选用GCC,怎么着才能更好的行使GCC。如今,GCC能够用来编译C/C++、FORTRAN、JAVA、OBJC、ADA等语言的程序,可按照须求选拔设置支撑的言语。

语法

gcc(选项)(参数)

选项

-o:指定生成的出口文件;
-E:仅执行编译预处理;
-S:将C代码转换为汇编代码;
-wall:展现警告新闻;
-c:仅执行编译操作,不开展一连操作。

参数

C源文件:指定C语言源代码文件。

实例
常用编译命令选项

假如源程序文件名为test.c

无选项编译链接

gcc test.c

test.c预处理、汇编、编译并链接形成可执行文件。
这边未指定输出文件,暗许输出为a.out

选项 -o

gcc test.c -o test

test.c预处理、汇编、编译并链接形成可执行文件test
-o挑拔取来指定输出文件的文书名。

选项 -E

gcc -E test.c -o test.i

将test.c预处理输出test.i文件。

选项 -S

gcc -S test.i

将预处理输出文件test.i汇编成test.s文件。
选项 -c

gcc -c test.s

将汇编输出文件test.s编译输出test.o文件。

无选项链接

gcc test.o -o test

将编译输出文件test.o链接成最终可执行文件test。

选项 -O

gcc -O1 test.c -o test

使用编译优化级别1编译程序。级别为1~3,级别越大优化职能越好,但编译时间越长。

多源文件的编译方法

假如有多少个源文件,基本上有二种编译方法:

万一有七个源文件为test.ctestfun.c

  • 八个文本一起编译

gcc testfun.c test.c -o test

testfun.ctest.c各自编译后链接成test可执行文件。

  • 分别编译各种源文件,之后对编译后输出的对象文件链接。

gcc -c testfun.c

将testfun.c编译成testfun.o

gcc -c test.c

将test.c编译成test.o

gcc -o testfun.o test.o -o test

将testfun.o和test.o链接成test

以上二种办法相相比,第一中方法编译时须要持有文件再度编译,而第三种格局可以只重复编译修改的文件,未修改的文件不用再行编译。


再来复习一下:

gcc -c a.c 编译成目的文件a.o

gcc -o a a.o 生成执行文书a.exe

gcc a.c 生成执行文书a.exe

gcc -o a -c a.c 编译成目标文件a

gcc -o a a.c 生成执行文书a.exe

在a.c中援引test.c中的一个函数后:

gcc -c test.c 编译成目的文件test.o

gcc -c a.c 编译成目标文件a.o

gcc -o a test.o a.o 生成执行文书a.exe

gcc -o a test.o a.c 生成执行文书a.exe

gcc -o a test.c a.c 生成执行文书a.exe

gcc -o a test.o a.c 生成执行文书a.exe

总结:只要参数中有-c,总是变化目的文件;只要参数中无-c而只有-o,则总是变化执行文书。


在刚初始攻读 C
语言的时候,大家已经学习过,当大家的顺序唯有一个main.c文本时,大家得以在命令行中通过

gcc -o program main.c

对单个代码文件举办编译,生成可执行文件program,并且通过./program运转编译生成的次第。在我们后边的学科中,计蒜客的读书系统也帮您举行了这么的操作。

比较于单个文件、单一成效的次第,当程序有多个模块时,难题就从头变得复杂了。我们对每种模块会率先编译出种种模块对应的*.o目标代码文件(relocatable
object file),例如:

gcc -c -o set.o set.c

会将大家的一个set.c文件编译成一个set.o的目的代码文件。请小心,那里的-c表示生成目的代码文件。-o与事先单文件的时候同样,在它今后大家会写明被转移的文件的称呼。

当我们做到了每种独自模块的编译并赢得它们的对象代码文件后,大家可以将大家的主程序的靶子代码文件与她们链接在一起。例如:

gcc -o program main.o set.o others.o

将对象代码文件set.oothers.omain.o在链接在一块,并且输出了
可执行文件(excutable file)program。

俺们仍旧得以由此./program运作编译生成的顺序。

当大家将一个顺序写在多少个文本中时,逐个文书中的变量和函数暗许都是只有文件内的一些才方可访问的。不过有部分特种的全局变量、类型定义、函数可能会须求在多少个公文中被选拔。

此刻,大家得以将那类的内容单独写成一个 头文件(header
file),并且将全局变量、类型定义、函数注明写到头文件中。

对此一个文件set.c,习惯上它的头文件会被命名为set.h。在装有须要用set.h中全局变量、类型定义、声明的函数的文本中,用

#include "set.h"

将相应的头文件引入。在此间的引入头文件措施和引入系统库头文件的不二法门很类似,只不过那里用的是引号""而不是尖括号<>

鉴于头文件里也可以引入头文件,因而大家只怕实际数次引入同一个文书,比如我们引1.h2.h,且1.h也引入2.h,那时因为2.h被引入了两回,就有只怕出现重复的扬言。为了化解那一个难题,大家2.h中定义一个宏,在2.h的最开首判断那些宏是还是不是被定义过,如果被定义过,就跳过2.h全方位文件的情节。

那边大家将会用到多少个新的预处理指令#ifndef xxx#endif,它们成对出现且#ifndef在前,功能是一旦此时并未已定义xxx宏,则这对#ifndef xxx,
#endif里面的故事情节使得。(其中xxx可以轮换为私自宏名)

这样```2.h```可以写为类似于如下的内容:
#ifndef xxx
#define xxx
typedef enum Status { Success, Fail };
typedef struct {
    char *name;
    int age;
} People;
Status go_to_Jisuanke(People);
#endif

精心的同校早已意识,如若在程序中绝非引入2.h的职位定义了xxx宏,则#include "2.h"中的注脚并不会被引入,因而大家不该在此采纳xxx那种平凡的名字。实际上,大家一般会利用一个与头文件名相关的名字来顶替xxx,比如一个常用的代码风格里,那些宏的名字形式为工程名_路径名_文件名_H_

图片 7

小结的几点

  • 某一代码中定义的函数即使须要被其它代码文件所利用,应该将函数的扬言放入头文件,并在别的代码文件中引入这一头文件。
  • 并不需求把每一个函数单独写成一个模块,依然应当依据效益的分开和落实去决定怎么抽出模块。
  • 可以只有三个.c的文本,也并不一定非要都拆出.h文件。
  • #include可以被用来引入系统库头文件也足以被用于引入本身已毕的头文件。
  • 只然则在引入系统库头文件时,大家一再会使用尖括号<>,而在引入自个儿已毕的头文件时一般用引号""
  • gcc时,-o日后写的是生成可执行文件的名号。-c的参数的行使会帮大家得到一个目的文件。

//-c和-o都是gcc编译器的可选参数

//-c表示只编译(compile)源文件但不链接,会把.c或.cc的c源程序编译成目标文件,一般是.o文件。
//-o用于指定输出(out)文件名。不用-o的话,一般会在当前文件夹下生成默认的a.out文件作为可执行程序。

//例如
gcc -c test.c          //将生成test.o的目标文件
gcc -o app test.c           //将生成可执行程序app

gcc -c a.c -o a.o          //表示把源文件a.c编译成指定文件名a.o的中间目标文件(其实在这里,你把-o a.o省掉,效果是一样的,因为中间文件默认与源文件同名,只是后缀变化)。

data.c 是.NET程序集的二进制内容

Makefile

在前头学习多模块程序的时候,大家要求先把种种模块的代码都生成为目的代码文件,然后再将目的代码文件联编成一个可执行文件。即使每趟编译都要输入这么多命令,是否很复杂呢?即便老是修改一点点内容就必要重新编译整个工程,是还是不是很浪费时间呢?

为了缓解所遭受的题材,方便开发,大家使用一个誉为make的一声令下,它可以读取Makefile文件,并且依照Makefile中的规则描述把源文件生成为可实施的次第文件。

最宗旨的Makefile中富含了一多重方式如下的条条框框。请留心,每一条规则的指令前,必需要有一个制表符\t。

目标: 依赖1 依赖2 ...
    命令

诸如,可以写一条规则:

array.o: array.c array.h
   gcc -c -o array.o array.c

意味着生成的文书是目的代码文件array.o,它借助于array.carray.h
当大家在指令行中执行make array.o时,依照这一条条框框,假设array.o不设有或然array.carray.h起码之一比array.o立异,就会实行gcc -c -o array.o array.c

俺们把上述代码保存为Makefile,与array.carray.h位于同样目录,在分外目录里实施make array.o就能看出效果。

注意:Makefile里的除当前目录隐藏文件外的首先个目标会变成运行make不点名目标时的私自认同目的。

再看:

main: array.o main.o
    gcc -o main array.o main.o

main.o: main.c array.h
    gcc -c -o main.o main.c

array.o: array.c array.h
    gcc -c -o array.o array.c

Makefile有多条规则时,假若我们盼望只生成其中一个,我们得以在make命令后拉长必要转变的靶子的名号。例如,在此处大家得以推行make main.omake array.omake main。当大家履行make main时,make指令发现array.omain.o不设有,就会依据以它们为目的的平整先生成它们。

众多时候,会须求将.o为后缀的目的代码文件和可举行的程序文件删除,完全从头举行编译。那么咱们可以写一条clean规则,例如:

clean:
    rm -f array.o main.o main

rm命令表示删除文件,-f意味着强制,因而rm -f array.o main.o main

依据预期,当大家实践make clean就可以去除array.omain.omain了。事实真的这么吗?

因为终究那时借使已经存在clean文件,rm指令就不会履行了。为了消除这几个难题,我们透过一个独特的不二法门告诉make其一名为clean的规则在clean存在的时候照旧有效。

.PHONY: clean

clean:
    rm -f array.o main.o main

.PHONY用来声雅培些伪目的,伪目的与日常的靶子的显要差异是伪指标不会被检查是还是不是存在于文件系统中而暗许不设有且不会选拔专断认同规则变化它。

在Makefile中大家还足以行使它的变量和注释。

# 井号开头的行是一个注释
# 设置 C 语言的编译器
CC = gcc

# -g 增加调试信息
# -Wall 打开大部分警告信息
CFLAGS = -g -Wall

# 整理一下 main 依赖哪些目标文件
MAINOBJS = main.o array.o

.PHONY: clean

main: $(MAINOBJS)
    $(CC) $(CFLAGS) -o main $(MAINOBJS)

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

main.o: main.c array.h
    $(CC) $(CFLAGS) -c -o main.o main.c

clean:
    rm -f $(MAINOBJS) main

地方那几个事例已经是一个相比完整的Makefile了。以#始发的是我们的笺注,我们在此处用注释表明了大家定义的Makefile变量的用处。CC变量定义了编译器,CFLAGS变量标记了编译参数,MAINOBJS变量记录了main正视的靶子文件。定义的变量可以向来通过$(变量名)进展利用。

data_.c 是为了文件用户调用的对准data.c的函数和变量

总结

  • 一个 Makefile
    可以涵盖四个规则,大家既可以每便在make后证实履行哪个意义,也得以由此定义的all来进行一多如牛毛的规则。
  • 在用gcc编译时加上-Wall会显示错误音讯,Wall是用来呈现多数警戒音信的,编译错误消息默许就会来得。
  • Makefile其实描述了一多元转为对象文件、联编的进度,不使用make也是足以做到的。
  • Makefile中的变量是用$()的不二法门来用哒。

data.h  是data_.c的头文件,是用户c源码必须的。

Makefile体验

图片 8

(1)

→ ~/project ls -l                                                                                 

total 16                                                                                          
-rw-r--r-- 1 user user 304 Sep 15 16:46 array.c                                                   
-rw-r--r-- 1 user user  87 Sep 15 16:46 array.h                                                   
-rw-r--r-- 1 user user 297 Sep 15 16:46 main.c                                                    
-rw-r--r-- 1 user user   0 Sep 15 16:46 main.h                                                    
-rw-r--r-- 1 user user 419 Sep 15 16:46 Makefile                                                  
→ ~/project                                                                                       
→ ~/project cat Makefile                                                                          

# 设置 C 语言的编译器                                                                             
CC = gcc                                                                                          

# -g 增加调试信息                                                                                 
# -Wall 打开大部分警告信息                                                                        
CFLAGS = -g -Wall                                                                                 

# 整理一下 main 依赖哪些目标文件                                                                  
MAINOBJS = main.o array.o                                                                         

.PHONY: clean                                                                                     

main: $(MAINOBJS)                                                                                 
        $(CC) $(CFLAGS) -o main $(MAINOBJS)                                                       

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

main.o: main.c array.h                                                                            
        $(CC) $(CFLAGS) -c -o main.o main.c                                                       

clean:                                                                                            
        rm -f $(MAINOBJS) main                                                                    
→ ~/project                                                                                      

图片 9

(2)

→ ~/project make                

gcc -g -Wall -c -o main.o main.c                                                  
gcc -g -Wall -c -o array.o array.c                                    
gcc -g -Wall -o main main.o array.o                                     
→ ~/project                               

图片 10

(3)

→ ~/project ./main              

1 2 3 4 5 6 7 8 9 0                                     
数组元素和为: 45                                             
数组元素平均值为: 4.5                                      

→ ~/project                                                 

图片 11

(4)

→ ~/project make clean                   

rm -f main.o array.o main             

图片 12

(5)

→ ~/project            
→ ~/project ls -l     

total 16                                             
-rw-r--r-- 1 user user 304 Sep 15 16:46 array.c          

 

命令行参数

之前,main函数一般都没参数,对应在运行时,一般就平素输入可实施的主次文件名(例如./main)。

但实则main函数能够有参数。我们得以将其他过去无参数的main函数替换成上面这种有参数的main函数(可是考虑到我们并从未运用,不写是很正常的)。

int main(int argc, char **argv) {
    // ...
}

在这里,main函数有两个参数,第四个参数是整数型,会传播命令行参数的个数,程序运行时就足以拔取到。首个参数是char **,其中存储了用户从命令行传递进入的参数。

假使大家的主次可执行文件名为main,则在命令行中输入./main hello world俺们会拿到argc3argv[0]./mainargv[1]helloargv[2]world。如若有越来越多参数也得以以此类推。

命令行参数暗许都以空格分隔,可是一旦大家期望包括空格的一个字符串作为参数,我们则必要在输入参数时用引号将其包装起来。

设若大家的次第可执行文件名为main,则在命令行中输入./main "hello world" is my greet我们会取得argc5argv[0]./mainargv[1]hello worldargv[2]isargv[3]myargv[4]greet

其余被接受到的argv参数都足以被看做正常的字符串在代码里使用。在重重先后的陈设中,咱们会需求基于接收到的参数来控制程序的履行办法,那时候,学会使用argcargv就显示很重点了。在之后的学科中,你也会需要拔取这一块的学问,一定要学精晓喔。

3.将编译data.c编译为对象文件data.o

一部分总括

  • 命令行读入的参数是从命令行键入的可执行程序路径始于计算。
  • 在main函数中用于接收命令行参数的函数参数中,首个是命令行参数的个数。
  • 在int main(int argc, char **argv)中,argc就稳定为 2
    了,它取到的应有是命令行中键入的参数个数。

gcc -c -o data.o data.c

命令行参数

命令行参数是怎么获取和采用的?

请先输入 cat main.c 看一下我们脚下所在目录下的 main.c 文件。

图片 13

image.png

探望,在这些 main.c 的文本中,大家的 main 函数获取了命令行参数的个数
argc(整数型)和一多重参数(字符指针的指针,可以用拜访数组的花样拜访)。

本条顺序将预期输出命令行参数的数额,并且将各种参数逐一列出。
接下去让我们 make 一下,已毕对那几个程序的编译。

图片 14

image.png

完成了 make,就让大家把它运行起来吧。请输入 ./main
并运行起来这么些程序,并在其后随机输上一些空格分隔开的字符串,例如:

./main I feel better after this

俺们先后中的argc
接受到的参数一共是几个,它们各自对应了俺们在巅峰中输入的哪部分的内容吗。

图片 15

image.png

 

文件操作

前边课程中,大家学习、设计的拥有程序都以从标准输入进行读取、向专业输出举行写出的,操作系统为大家准备好了规范输入、标准输出的界面。在那节课中,大家就要学习如何从文件中开展读取、怎么着向文件进行写入。

在读文件的时候我们要求先有一个足以让大家访问到文件的 文件指针(file
pointer),它是一个FILE品类的指针。

俺们得以因而下边的办法宣示一个文书指针。

FILE *fp;

这时,假设大家希望对一个文件进行操作,大家须要先拔取

fp = fopen(文件路径, 访问模式);

将文件指针和文书涉及起来,其中第二个参数是一个字符串,对应了我们盼望访问的文书路径。第三个参数是造访方式,它可以是意味只读形式的"r",也足以是代表只写方式的"w",还足以是在文书末尾追加的"a"

当大家将文件指针和文件涉及起来后,我们就足以因此fgetc(fp);得到当前指针之后地点的一个字符了,每得到一个字符,指针会向后移动一个字符(假如到达文件尾部则会再次来到EOF)。

俺们那时候通过fputc('c', fp);的艺术将字符'c'写入到fp关联的文书内了。

叩问到那几个音讯后,大家就可以达成将一个文书复制到另一个文书内的函数了,例如:

void filecopy(FILE *in_fp, FILE *out_fp) {
    char ch;
    while ((ch = fgetc(in_fp)) != EOF) {
        fputc(ch, out_fp);
    }
}

其一函数接收的多个参数都以文件指针。那么些函数会通过一个可读情势的公文指针逐字符地读取,并且经过一个可写格局的文件指针逐字符地将兼具字符写出,从而起到复制文件内容的成效。

您必要小心,在给文件指针举行命名的时候,要回避 stdin、stdout 和 stderr
那五个名称。因为那八个名称其实早就用于规范输入、标准输出、标准错误的文本指针。

你或然会问了,那我们看到的 stdinstdout
stderr的那多少个文件指针可以直接使用呢?回答是一定的。

俺们是由此
fgetc(stdin);获取来自专业输入的字符,也足以经过fputc(ch, stdout);
fputc(ch, stderr);将变量 ch中的字符输出到专业输出或标准错误中的。

而外fgetc和fputc之外,大家还足以选用fscanf和fprintf函数。那三个函数都很像大家曾经很熟识的scanf和printf函数,只是可是,scanf和printf
可以被作为 fscanf和fprintf 的特例。

我们选取 fscanf 从文件指针in_fp举行读取时,可以写成:

fscanf(in_fp, "%c", &a);

而只要我们写

fscanf(stdin, "%c", &a);

那将完全与下部间接动用 scanf 的法门相当。

scanf("%c", &a);

就如地,我们利用fprintf向文件指针out_fp举办写出时,可以写成:

fprintf(out_fp, "%c", a);

而只要大家写

fprintf(stdout, "%c", a);

这将完全与下部直接选择 printf的主意卓绝。

printf("%c", a);

在使用文件同时规定不再接续选用后,我们要经过上面所示的不二法门将文件指针fp与公事的关系断开。你可以将它视为和fopen反倒的一个操作。

fclose(fp);

设若您不在程序中选用fclose,程序正常化截至时,程序会为所有打开的文本调用fclose

stdinstdout实际上也是被打开的文书指针,如若您觉得用不到的话,其实也是可以接纳fclose将她们关闭掉的。你可以友善试一试,关闭
stdinstdout 会对大家以前写过的顺序带来如何的影响吗?

4.将编译data_.c编译为目标文件data_.o

gcc -c -o data_.o data_.c -IC:/mono-3.2.3/include/mono-2.0

 

5.将data.o和data_.o 合成为一个纯粹的静态库:data.a

ar rcs data.a data_.o data.o

 

6.编译test.c和连接data.a,生成 test.exe

gcc -o output\test.exe test.c data.a %GCC_OPT% -lmonosgen-2.0

 

最终的果实如下

图片 16

 

winform 最基本的 lib 有以下多少个,添加到lib\mono\gac目录下。

图片 17

 

运行试试,不是难题

图片 18

 

那就是说最关切的作业来了。

那一个文件打包了mono的.net 运行时,size有多大呢?

图片 19

 

减掉一下

图片 20

 

相比较之下传统的打包.net 运行时 那应当是一个丰富好听的尝试吗,停止!

 

图片 21

编译后的程序:图片 22

 

 

假如大家以为有亟待,下篇小说我会写什么的安排 打包环境。

相关文章

网站地图xml地图