标题:哪位会写make file
只看楼主
moonwalker
Rank: 1
等 级:新手上路
威 望:1
帖 子:909
专家分:2
注 册:2007-3-2
 问题点数:0 回复次数:8 
哪位会写make file
初学编译命令,苦于没有合适的文档。
想请会的朋友写个例子。
比如,我有源文件main.c包含stdio.h
先编译成main.o,再链接为test.exe
用VC的nmake命令改如何完成上述操作?

我根据手头的教程的例子写成下面这样:
test: main.o
    cc -o test main.o
main.o:main.c
    cc -o main.c
可是提示cc不是可用命令,我又不知语法,请大侠指教

[[it] 本帖最后由 moonwalker 于 2008-7-2 23:01 编辑 [/it]]
搜索更多相关主题的帖子: make file 
2008-07-02 22:59
moonwalker
Rank: 1
等 级:新手上路
威 望:1
帖 子:909
专家分:2
注 册:2007-3-2
得分:0 
没人帮忙么?
唉,过几天轮到我编译版本了,每次编译版本,那些老鸟都要用两个通宵解决各种编译问题,
到我这个新手估计一个星期不用回家了。。。
谁手里有make file的教程也好啊,在网上没搜到什么合适的。。。
                                            —— 一个不想在公司通宵的人

“视频教程网”免费提供教学资源
C不限制你的自由!
条件是自己承担滥用自由的恶果!
2008-07-02 23:24
界水乘风
该用户已被删除
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽
2008-07-02 23:30
lingluoz
Rank: 2
来 自:苏州科技学院
等 级:新手上路
威 望:4
帖 子:749
专家分:0
注 册:2008-2-2
得分:0 
给你一些参考资料

Makefile 中文教程.pdf (526.66 KB)

Murphy's Law :
If there are two or more ways to do something, and one of those ways can result in a catastrophe, then someone will do it.
2008-07-02 23:40
moonwalker
Rank: 1
等 级:新手上路
威 望:1
帖 子:909
专家分:2
注 册:2007-3-2
得分:0 
谢谢各位。
还要谢谢楼上的文档,不过我在公司看的就是这个文档,但没你这个精美。
我那个例子也是照着这个文档写的,可是这样一个简单例子都不能实现,影响我看下去的决心啊。

“视频教程网”免费提供教学资源
C不限制你的自由!
条件是自己承担滥用自由的恶果!
2008-07-02 23:46
josen0205
Rank: 2
来 自:江苏
等 级:论坛游民
帖 子:307
专家分:52
注 册:2007-5-8
得分:0 
Linux和unix下面的经常用windows还真不知道怎么写,给你一个linux下面的例子吧
/**************************************************/
.SUFFIXES:  .c .o .ec .o

LIBDIR=${HOME}/lib
INCLDIR=${HOME}/incl
.c.o:
    cc -c -I$(INCLDIR) $*.c

OBJ=base.o
OBJ1=readshm.o
OBJ2=initshm.o

all:libbase.a readshm initshm

libbase.a: $(OBJ)
    @echo "Compiling libbase.a..."
    ar -rv $@ $(OBJ)
    mv -f $@ ${HOME}/lib

readshm:  $(OBJ1)
    cc -o $@  -L$(LIBDIR) $(OBJ1) -lbase
    mv -f $@ ${HOME}/bin

initshm:  $(OBJ2)
    cc -o $@  -L$(LIBDIR) $(OBJ2) -lbase
    mv -f $@ ${HOME}/bin

c:
    rm -f *.o

只有想不到,没有做不到
2008-07-03 08:53
ioriliao
Rank: 7Rank: 7Rank: 7
来 自:广东
等 级:贵宾
威 望:32
帖 子:2829
专家分:647
注 册:2006-11-30
得分:0 
我也传个, 不知与上面的有重复否.但愿没有.
howToMakefile.pdf (638.1 KB)

/images/2011/147787/2011051411021524.jpg" border="0" />
2008-07-03 09:02
VxWorks
Rank: 3Rank: 3
来 自:WindRiver
等 级:论坛游民
威 望:6
帖 子:859
专家分:68
注 册:2007-11-24
得分:0 
笨的很,肯定没有仔细看文档
cc -o test main.o是Unix系统下编译C的命令,使用的编译程序是cc,cc经常是到gcc的一个符号链接

每一条规则后面是一个命令:
test: main.o
    cc -o test main.o
make程序只是一个根据规则来执行命令的工具,实例中的命令是cc的编译命令,你用vc来编译怎能还用cc?vc中编译C/C++的编译器是cl.exe,所以cc应该换成cl,而且你还需要在msdn中查cl的编译命令,cl的选项和cc可不一样。

另外vc提供了makefile导出功能,IDE可以自动生成.mak扩展名的makefile文件。
举个例子,我写了一个hello world的程序:
工程由三个文件组成:
程序代码:
// stdafx.h : include file for standard system include files,
//  or project specific include files that are used frequently, but
//      are changed infrequently
//

#if !defined(AFX_STDAFX_H__98767A9E_4AED_415A_8D58_510A12773B35__INCLUDED_)
#define AFX_STDAFX_H__98767A9E_4AED_415A_8D58_510A12773B35__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#define WIN32_LEAN_AND_MEAN        // Exclude rarely-used stuff from Windows headers

#include <stdio.h>

// TODO: reference additional headers your program requires here

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_STDAFX_H__98767A9E_4AED_415A_8D58_510A12773B35__INCLUDED_)


程序代码:
// tt.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

int main(int argc, char* argv[])
{
    printf("Hello World!\n");
    return 0;
}

程序代码:
// stdafx.cpp : source file that includes just the standard includes
//    tt.pch will be the pre-compiled header
//    stdafx.obj will contain the pre-compiled type information

#include "stdafx.h"

// TODO: reference any additional headers you need in STDAFX.H
// and not in this file


在project中选Export Makefile,自动生成tt.mak
程序代码:
# Microsoft Developer Studio Generated NMAKE File, Based on tt.dsp
!IF "$(CFG)" == ""
CFG=tt - Win32 Debug
!MESSAGE No configuration specified. Defaulting to tt - Win32 Debug.
!ENDIF 

!IF "$(CFG)" != "tt - Win32 Release" && "$(CFG)" != "tt - Win32 Debug"
!MESSAGE Invalid configuration "$(CFG)" specified.
!MESSAGE You can specify a configuration when running NMAKE
!MESSAGE by defining the macro CFG on the command line. For example:
!MESSAGE 
!MESSAGE NMAKE /f "tt.mak" CFG="tt - Win32 Debug"
!MESSAGE 
!MESSAGE Possible choices for configuration are:
!MESSAGE 
!MESSAGE "tt - Win32 Release" (based on "Win32 (x86) Console Application")
!MESSAGE "tt - Win32 Debug" (based on "Win32 (x86) Console Application")
!MESSAGE 
!ERROR An invalid configuration is specified.
!ENDIF 

!IF "$(OS)" == "Windows_NT"
NULL=
!ELSE 
NULL=nul
!ENDIF 

CPP=cl.exe
RSC=rc.exe

!IF  "$(CFG)" == "tt - Win32 Release"

OUTDIR=.\Release
INTDIR=.\Release
# Begin Custom Macros
OutDir=.\Release
# End Custom Macros

ALL : "$(OUTDIR)\tt.exe"


CLEAN :
    -@erase "$(INTDIR)\StdAfx.obj"
    -@erase "$(INTDIR)\tt.obj"
    -@erase "$(INTDIR)\tt.pch"
    -@erase "$(INTDIR)\vc60.idb"
    -@erase "$(OUTDIR)\tt.exe"

"$(OUTDIR)" :
    if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"

CPP_PROJ=/nologo /ML /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Fp"$(INTDIR)\tt.pch" /Yu"stdafx.h" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c 
BSC32=bscmake.exe
BSC32_FLAGS=/nologo /o"$(OUTDIR)\tt.bsc" 
BSC32_SBRS= \
    
LINK32=link.exe
LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib  kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:no /pdb:"$(OUTDIR)\tt.pdb" /machine:I386 /out:"$(OUTDIR)\tt.exe" 
LINK32_OBJS= \
    "$(INTDIR)\StdAfx.obj" \
    "$(INTDIR)\tt.obj"

"$(OUTDIR)\tt.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
    $(LINK32) @<<
  $(LINK32_FLAGS) $(LINK32_OBJS)
<<

!ELSEIF  "$(CFG)" == "tt - Win32 Debug"

OUTDIR=.\Debug
INTDIR=.\Debug
# Begin Custom Macros
OutDir=.\Debug
# End Custom Macros

ALL : "$(OUTDIR)\tt.exe"


CLEAN :
    -@erase "$(INTDIR)\StdAfx.obj"
    -@erase "$(INTDIR)\tt.obj"
    -@erase "$(INTDIR)\tt.pch"
    -@erase "$(INTDIR)\vc60.idb"
    -@erase "$(INTDIR)\vc60.pdb"
    -@erase "$(OUTDIR)\tt.exe"
    -@erase "$(OUTDIR)\tt.ilk"
    -@erase "$(OUTDIR)\tt.pdb"

"$(OUTDIR)" :
    if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"

CPP_PROJ=/nologo /MLd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Fp"$(INTDIR)\tt.pch" /Yu"stdafx.h" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ  /c 
BSC32=bscmake.exe
BSC32_FLAGS=/nologo /o"$(OUTDIR)\tt.bsc" 
BSC32_SBRS= \
    
LINK32=link.exe
LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib  kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:yes /pdb:"$(OUTDIR)\tt.pdb" /debug /machine:I386 /out:"$(OUTDIR)\tt.exe" /pdbtype:sept 
LINK32_OBJS= \
    "$(INTDIR)\StdAfx.obj" \
    "$(INTDIR)\tt.obj"

"$(OUTDIR)\tt.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
    $(LINK32) @<<
  $(LINK32_FLAGS) $(LINK32_OBJS)
<<

!ENDIF 

.c{$(INTDIR)}.obj::
   $(CPP) @<<
   $(CPP_PROJ) $< 
<<

.cpp{$(INTDIR)}.obj::
   $(CPP) @<<
   $(CPP_PROJ) $< 
<<

.cxx{$(INTDIR)}.obj::
   $(CPP) @<<
   $(CPP_PROJ) $< 
<<

.c{$(INTDIR)}.sbr::
   $(CPP) @<<
   $(CPP_PROJ) $< 
<<

.cpp{$(INTDIR)}.sbr::
   $(CPP) @<<
   $(CPP_PROJ) $< 
<<

.cxx{$(INTDIR)}.sbr::
   $(CPP) @<<
   $(CPP_PROJ) $< 
<<


!IF "$(NO_EXTERNAL_DEPS)" != "1"
!IF EXISTS("tt.dep")
!INCLUDE "tt.dep"
!ELSE 
!MESSAGE Warning: cannot find "tt.dep"
!ENDIF 
!ENDIF 


!IF "$(CFG)" == "tt - Win32 Release" || "$(CFG)" == "tt - Win32 Debug"
SOURCE=.\StdAfx.cpp

!IF  "$(CFG)" == "tt - Win32 Release"

CPP_SWITCHES=/nologo /ML /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Fp"$(INTDIR)\tt.pch" /Yc"stdafx.h" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c 

"$(INTDIR)\StdAfx.obj"    "$(INTDIR)\tt.pch" : $(SOURCE) "$(INTDIR)"
    $(CPP) @<<
  $(CPP_SWITCHES) $(SOURCE)
<<


!ELSEIF  "$(CFG)" == "tt - Win32 Debug"

CPP_SWITCHES=/nologo /MLd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Fp"$(INTDIR)\tt.pch" /Yc"stdafx.h" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ  /c 

"$(INTDIR)\StdAfx.obj"    "$(INTDIR)\tt.pch" : $(SOURCE) "$(INTDIR)"
    $(CPP) @<<
  $(CPP_SWITCHES) $(SOURCE)
<<


!ENDIF 

SOURCE=.\tt.cpp

"$(INTDIR)\tt.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\tt.pch"



!ENDIF 



为了防止世界被破坏,为了守护世界的和平,贯彻爱与真实的邪恶,可爱又迷人的反派角色,VxWorks!
Don't ask me any question.I'm just here to buy soy sauce.
2008-07-03 10:18
moonwalker
Rank: 1
等 级:新手上路
威 望:1
帖 子:909
专家分:2
注 册:2007-3-2
得分:0 
很感谢楼上各位,特别是vxworks的指导,很有启发,今天太晚,明天来细看。

“视频教程网”免费提供教学资源
C不限制你的自由!
条件是自己承担滥用自由的恶果!
2008-07-04 00:09



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-222345-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.441782 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved