如何为C#编写makefile?

时间:2013-12-05 07:22:22

标签: c# mono makefile

我有一个简单的C#程序,需要在Linux中通过mono运行命令行。到目前为止,这是我的makefile的内容。它基于我为另一个程序找到的C ++ makefile。我尝试修改它以使用我的C#程序,但它说某些源文件无法找到。

.PHONY : build view clean

build : test
@# do nothing

test : test.o
gmcs test test.o

test.o : test.cs
gmcs test.cs

view :
@\less test.cs

clean :
-\rm *.exe
-\rm test

我以前从未使用过makefile,所以我真的不知道自己做错了什么。我的整个项目中只有一个文件,而这只是test.cs.这样做的最终目标是能够通过在命令行中输入来运行程序:

./test

它应该清理生成的.exe文件。

3 个答案:

答案 0 :(得分:2)

我整理了一个非常简单的Mono Makefile,对我有用:

.PHONY: test.cs

all: run

test.exe: test.cs
    @gmcs test.cs 

clean:
    @rm -f test.exe

run: test.exe
    @mono test.exe

这有一个很好的属性,如果你只输入'make',它将重新编译并执行test.cs。

答案 1 :(得分:1)

我在我的项目中使用了一个非常简单的Makefile模型。 (PS:我在GNU / Linux上使用mono进行编译,但是更改配置非常容易(阅读我的评论))

<div class="dropdown">
        <a class="btn dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">Some title</a>

        <div class="dropdown-menu dropdown-menu-right subscribe-box" aria-labelledby="dropdownMenu1">

          <ul class="nav nav-pills" id="myTab">
            <li class="active"><a href="#" data-target="#mail" data-toggle="tab"><i class="fa fa-envelope-o"></i></a></li>
            <li><a href="#" data-target="#twitter" data-toggle="tab"><i class="fa fa-twitter"></i></a></li>
            <li><a href="#" data-target="#sms" data-toggle="tab"><i class="fa fa-commenting"></i></a></li>
            <li><a href="#" data-target="#rss" data-toggle="tab"><i class="fa fa-rss"></i></a></li>
          </ul>

          <div class="tab-content">
            <div class="tab-pane active" id="mail">
              <p>Enter your email address.</p>
              <div class="row">
                <div class="col-sm-8 input-box">
                  <input placeholder="name@email.com" type="text">
                </div>
                <div class="col-sm-4 input-button">
                  <a href="" class="btn">Subscribe</a>
                </div>
              </div>
            </div>

            <div class="tab-pane" id="twitter">
              <p>Enter your twitter username</p>
              <input placeholder="@username" type="text">
            </div>

            <div class="tab-pane" id="sms">
              <p>phone</p>
              <input placeholder="555-123-4567" type="text">
            </div>

            <div class="tab-pane" id="rss">
              <p>rss link</p>
            </div>
          </div>

        </div>
      </div>

    </div>

答案 2 :(得分:0)

为了回答这个问题,我将详细介绍makefile:
当你有这样的陈述时:

test: test.o
    gmcs test test.o

这意味着:为了构建目标测试,您需要目标test.o并运行命令gmcs test test.o

当您键入命令行make target时,它将尝试按照您在makefile中编写的规则构建目标。所以,在我们的例子中,当你执行make test时,程序将尝试构建测试,看它需要构建test.o之前,找到这个规则:

test.o: test.cs
    gmcs test.cs

找到文件test.cs,运行gmcs test.cs,然后返回上一个目标,然后立即运行gmcs test test.o,你的目录中没有test或test.o,所以命令报告错误。

令你困惑的是(我可以猜到这一点)是c ++ make文件。在c ++中,您首先创建目标文件(在Linux中为.o,在Windows中为.obj),然后将它们链接在一起。我不确定,但是你对.o目标的c ++ makefile中的命令是使用-c标志 - 一个告诉gcc只编译的标志。在你的情况下,程序在第一个命令之后完全编译。

所以 - 您正在寻找的makefile如下:

PHONY : build view clean

build : test
@# do nothing

test: test.cs
    gmcs test.cs -out:test

view :
@\less test.cs

clean :
-\rm *.exe
-\rm test

将创建名为test的文件,您可以使用mono test运行它。如果你想省略mono,你可以创建一个脚本文件:

#! /bin/bash

mono test 

不要忘记更改权限以允许您执行它!