独立运作,重返了根目录

.NET程序独立运作是指运转.NET的微处理器上,不必要安装.NET框架。

pwd
归来了根目录

.NET程序集“独立运维”并非真的的独自,它是运作在mono运维时基础之上的。由于那一个运维时方可独自存在,所以,大家不供给在对象机上安装.NET框架。

那时候看到系统重返了二个 /,这几个 / 被大家称为系统的
根目录(root),那些任务也等于大家前天在系统中的地方。

图片 1

而是,大家要拓展工作的职责的不2秘籍为:

 

/home/user/project

 

因此,我们要学会怎么切换大家所在的岗位:

如上图:

输入 cd 命令,并在 cd 命令后增进空格,在事后输入实行工作的职务的不二秘诀:

 

cd /home/user/project

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

那正是一个层级化路径,其实其能够透过

 

cd home
cd user
cd project

2,mono的.NET运转时,那是三个动态库文件(mono同时提供了静态库),是.NET程序集运转的要紧条件。

逐次到达。

 

下载输入 ls -l。
此处就有个old目录。

三,MONO运转时的铺排文件或文件夹(并不一定须求)。

图片 2

 

image.png

4,外部的顺序集并未有松开到C程序中的其余的相关.NET程序集。

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

“独立运营”的长河是:

再选取移动操作:

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

图片 3

 

挪动文件

即:

再成立新文件,通过命令

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

touch main.c 

 

始建新文件
那会儿可以看见:

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

图片 4

好了,有了上述的理论知识,下面我们就从头履行一下吗

成立文件

 

old目录下把key删除

一.选取Xbuid命令编写翻译

图片 5

图片 6

删除“`key“`文件

 

更加多相关命令的可叠加参数及利用意义,能够通过
man [空格] [命令名]的不2秘诀开始展览拓展更为的查询(查询后脱离只需敲击键盘上的
q 即可)。

二.把编写翻译后的net 运营文件 写入到三个 char[]变量中,并记下那些顺序集的称号,大小

越来越多复杂的通令,点击那里

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

多模块程序

事先的课中,全数文件操作都以单文件举办。对于三个只完毕3个特定的职分,只包括十多个函数的顺序来说,单文件的企业管理办公室法还算还不错,然而当程序越来越长,程序达成的作用进一步多,将她们尽数都组织在二个文件里就会变得不那么简单让人收受了。

从而,我们需求上学怎么在 C
语言中将不一致效率在八个代码文件中分头达成,然后将它们作为多少个模块组织在壹块为同2个程序服务。


会生成3个文件

关于gcc命令

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

gcc命令使用GNU推出的基于C/C++的编写翻译器,是开放源代码领域选用最常见的编写翻译器,具有作用强大,编译代码帮助品质优化等特点。今后无数程序员都选拔GCC,怎么样才能越来越好的利用GCC。近期,GCC能够用来编写翻译C/C++、FO卡宴TRAN、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编写翻译程序。级别为壹~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运营编写翻译生成的先后。在大家事先的学科中,计蒜客的读书类别也帮您进行了如此的操作。

比较于单个文件、单1作用的先后,当程序有多少个模块时,难题就从头变得复杂了。我们对每五个模块会首先编译出各种模块对应的*.o指标代码文件(relocatable
object file),例如:

gcc -c -o set.o set.c

会将大家的3个set.c文本编写翻译成3个set.o的目标代码文件。请留心,那里的-c表示生成目的代码文件。-o与事先单文件的时候同样,在它未来我们会写明被转移的文书的名号。

当大家做到了每2个单独模块的编译并得到它们的对象代码文件后,大家得以将大家的主程序的靶子代码文件与他们链接在1块。例如:

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

将目的代码文件set.oothers.omain.o在链接在壹起,并且输出了
可执行文件(excutable file)program。

我们照例能够通过./program运行编写翻译生成的次序。

当大家将三个先后写在七个公文中时,每三个文本中的变量和函数暗中认可都以只有文件内的片段才得以访问的。不过有部分不相同平常的全局变量、类型定义、函数恐怕会须求在多少个公文中被采取。

这时候,大家得以将那类的剧情单独写成1个 头文件(header
file),并且将全局变量、类型定义、函数评释写到头文件中。

对此1个文书set.c,习惯上它的头文件会被命名字为set.h。在具有需求用set.h中全局变量、类型定义、评释的函数的公文中,用

#include "set.h"

将相应的头文件引进。在此间的引进头文件措施和引进系统库头文件的措施很相近,只可是这里用的是引号""而不是尖括号<>

鉴于头文件里也足以引进头文件,因而大家大概实际数11次引进同八个文件,比如大家引1.h2.h,且1.h也引入2.h,那时因为2.h被引进了一次,就有望出现重复的宣示。为了化解这几个题目,咱们2.h中定义三个宏,在二.h的最起初判断那些宏是还是不是被定义过,尽管被定义过,就跳过二.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那种平凡的名字。实际上,我们1般会选用一个与头文件名相关的名字来顶替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中带有了一各个形式如下的条条框框。请留心,每一条规则的下令前,必须求有3个制表符\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用以声美素佳儿(Nutrilon)些伪目的,伪目的与通常的对象的严重性差别是伪指标不会被检查是或不是留存于文件系统中而默许不设有且不会利用默认规则变化它。

在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

地点那些例子已经是3个比较完整的Makefile了。以#初始的是大家的笺注,大家在此地用注释表达了笔者们定义的Makefile变量的用处。CC变量定义了编译器,CFLAGS变量标记了编译参数,MAINOBJS变量记录了main借助的对象文件。定义的变量能够直接通过$(变量名)举行应用。

data_.c 是为着文件用户调用的指向data.c的函数和变量

总结

  • 三个 Makefile
    能够包罗几个规则,大家既能够每一回在make后证实履行哪个意义,也足以经过定义的all来实施①多元的平整。
  • 在用gcc编写翻译时加上-沃尔会展现错误消息,沃尔是用来呈现多数告诫新闻的,编写翻译错误消息暗许就会议及展览示。
  • Makefile其实描述了1各类转为对象文件、联编的长河,不应用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就体现很主要了。在其后的科目中,你也会须求运用那一块的学识,一定要学驾驭喔。

三.将编写翻译data.c编译为指标文件data.o

一部分统计

  • 命令行读入的参数是从命令行键入的可执行程序路径始于臆想。
  • 在main函数中用于接收命令行参数的函数参数中,第三个是命令行参数的个数。
  • 在int main(int argc, char **argv)中,argc就固定为 二了,它取到的应该是命令行中键入的参数个数。

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

 

文本操作

前边课程中,大家上学、设计的有所程序都以从标准输入举办读取、向专业输出举办写出的,操作系统为大家准备好了标准输入、标准输出的界面。在那节课中,我们将要学习怎么样从文件中举行读取、怎样向文件进行写入。

在读文件的时候大家须要先有1个得以让我们走访到文件的 文件指针(file
pointer),它是1个FILE类型的指针。

我们能够透过下边包车型客车办法宣示3个文本指针。

FILE *fp;

那时候,如若咱们期望对三个文本举行操作,大家要求先选择

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

将文件指针和文书涉及起来,当中第叁个参数是多个字符串,对应了笔者们期望访问的文书路径。第贰个参数是造访情势,它能够是表示只读情势的"r",也得以是意味着只写方式的"w",还足以是在文书末尾追加的"a"

当大家将文件指针和文件涉及起来后,大家就足以因此fgetc(fp);得到当前线指挥部针之后地点的2个字符了,每获得贰个字符,指针会向后活动一个字符(假诺到达文件后面部分则会回来EOF)。

咱俩那儿通过fputc('c', fp);的不2秘籍将字符'c'写入到fp事关的文本内了。

打探到这么些音信后,大家就足以达成将1个文书复制到另二个文书内的函数了,例如:

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

以此函数接收的八个参数都以文本指针。这么些函数会通过3个可读格局的文件指针逐字符地读取,并且经过二个可写方式的文书指针逐字符地将全体字符写出,从而起到复制文件内容的效应。

您须求注意,在给文件指针实行命名的时候,要逃避 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 的不2法门11分。

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

 

 

比方我们认为有亟待,下篇文章笔者会写什么的配备 打包环境。