`
jubincn
  • 浏览: 242634 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
文章分类
社区版块
存档分类
最新评论

makefiles快速上手教程 原文地址:http://mrbook.org/tutorials/make/

 
阅读更多

原文地址:http://mrbook.org/tutorials/make/


译者自述:

最开始接触开源软件时,觉得make很神秘,打开makefile,更加深了这种感觉。好在上学时不需要写大型程序,并且C/C++基本只在VC6下写过,所以一直没有勇气和动力来弄。工作后,尝试使用vim/vimgdb,在里面用gcc很不方面,还是将其写入makefile,直接输入个make命令来的简单。上网查了下,makefile入门也不是很难,找了很多文章,属这个简单,甚喜。独乐乐不如众乐乐,况翻译一遍能加深印象,故有此文。


书写长长的编译命令是很枯燥无聊而又费时的,尤其是包含多个文件的编译命令。令人高兴的是这种人们必须在命令行中敲入编译的命令的时代已经结束了,因为我们将使用makefie,在make工具的帮助下实现自动化编译。Makefiles是遵循make工具可以识别的语法规则编写的文件,可以看作是make的脚本程序。此文中将用到下面这些文件:

我建议您将这些文件放到一个单独的文件夹中来使用。

备注:文中我使用了g++。您可以使用任意的编译器来代替文中的g++。


make工具的使用

如果您在命令行中执行

make

那么make工具将在当前目录中查找是否有名为“makefile”的文件并执行。如果您有多个makefiles文件,那么您可以使用-f参数来指定将要执行的makefile:

make -f mymakefile

make还有一些其它的参数,若需更多信息,请man make

Build过程

  1. 编译器将源文件编译成object文件
  2. 连接器将object文件链接成可执行文件

手动编译

命令行中直接调用编译器/连接器来的方式:

g++ main.cpp hello.cpp factorial.cpp -o hello

Makefile基本结构

Makefile的基本结构包括:

target: dependencies

[tab] system command

按照这种格式,我们的makefile可以写成这样:

all:

g++ main.cpp hell.cpp factorial.cpp -o hello

[Downloadhere]

若执行这个makefile,在命令行中输入:

make -f Makefile-1

在第一个例子中,我们定义了一个名为all的target。这是Makefile的默认target,如果没有指定其它target的话,make将会执行这个target。在这里,target all没有指定dependencies,所以make就直接执行g++命令了。

使用依赖

很多时候使用多个target是很有好处的。如果你仅仅是修改了工程中的一个文件,那么make只需修改那个文件相关的target,而不需要将工程中的文件全部重新编译一遍。

下面是使用多个target的Makefile:

all: hello

hello: main.o factorial.o hello.o

g++ main.o factorial.o hello.o -o hello

main.o: main.cpp

g++ -c main.cpp

factorial.o: factorial.cpp

g++ -c factorial.cpp

hello.o: hello.cpp

g++ -c hello.cpp

clean:

rm -rf *.o hello

[Downloadhere]

在这里,target all 只有一个dependencies,没有系统命令。make会首先满足all的依赖,方法是搜索依赖的target,并执行。依赖的target也许有自己的依赖和命令,那么这个过程递归进行,知道所有的依赖都得到满足。在这个例子中,我们看到有个名为clean的target。这个一般都是用于清理所有的objects和可执行文件。

使用变量和注释

在Makefile中,您也可以定义和使用变量。当需要批量修改编译器参数时,使用变量是很方便的。

#I am a comment, and I want to say that the variable CC will be

#the compiler to use

CC=g++

#Hey! I am comment nuber 2, I want to say that CFLAGS wiil be the

#options I'll pass to the compiler

CFLAGS=-c -Wall

all: hello

hello: main.o factorial.o hello.o

$(CC) main.o factorial.o hello.o -o hello

main.o: main.cpp

$(CC) $(CFLAGS) main.cpp

factorial.o: factorial.cpp

$(CC) $(CFLAGS) factorial.cpp

hello.o: hello.cpp

$(CC) $(CFLAGS) hello.cpp

clean:

rm -rf *.o hello

[Downloadhere]

正如上面所示,变量是十分有用的。定义和使用变量的方式很简单,在写target之前将一个值赋给一个变量即可完成定义,使用$(VAR)可以获得变量值。


Where to go from here

With this brief introduction to Makefiles, you can create some very sophisticated mechanism for compiling your projects. However, this is just a tip of the iceberg. I don't expect anyone to fully understand the example presented below without having consulted someMake documentation(which I had to do myself) or read pages 347 to 354 of your Unix book.
CC=g++
CFLAGS=-c -Wall
LDFLAGS=
SOURCES=main.cpp hello.cpp factorial.cpp
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=hello

all: $(SOURCES) $(EXECUTABLE)
	
$(EXECUTABLE): $(OBJECTS) 
	$(CC) $(LDFLAGS) $(OBJECTS) -o $@

.cpp.o:
	$(CC) $(CFLAGS) $< -o $@


[Downloadhere]

If you understand this last example, you could adapt it to your own personal projects changing only 2 lines, no matter how many additional files you have !!!.

下一步的学习

完成文中的例子后,您已经可以写一个基本的makefile了。然而,这里的东西仅仅是冰山一角,我没指望所有人都能在不查Make documentation的情况下完全理解下面的代码(即使我自个儿也得查了才明白)。

CC=g++

CFLAGS=-c -Wall

LDFLAGS=

SOURCES=main.cpp hello.cpp factorial.cpp

OBJECTS=$(SOURCES: .cpp =.o)

EXECUTABLE=hello

all: $(SOURCES): $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS)

$(CC) $(LDFLAGS) $(OBJECTS) -o $@

.cpp.o:

$(CC) $(CFLAGS) $< -O $@

[Downloadhere]

如果您能理解这段代码,那么无论您的工程含多少个文件,只需修改其中两行这个makefile便可用于您的工程。


参考:

http://wiki.ubuntu.org.cn/%E8%B7%9F%E6%88%91%E4%B8%80%E8%B5%B7%E5%86%99Makefile:MakeFile%E4%BB%8B%E7%BB%8D

http://web.mit.edu/gnu/doc/html/make_3.html

http://www.cs.umd.edu/class/fall2002/cmsc214/Tutorial/makefile.html


分享到:
评论

相关推荐

    https://git.openwrt.org/feed/telephony.git

    5. **Makefiles**:每个软件包都有一个Makefile,用于指示编译系统如何构建和安装该软件包。 6. **Kconfig**:OpenWRT使用Kconfig进行配置,允许用户在编译前选择要启用的功能和组件。 7. **设备驱动程序**:对于...

    (winmerge for linux)grimmdp-winmerge-1bd708f4cf72.zip

    下载地址:https://bitbucket.org/grimmdp/winmerge 安装方法: WinMerge 3 ========== WinMerge 3 is a port of WinMerge (http://winmerge.org) to use cross-platform with Qt (http://qt.nokia.com/) ...

    ndk-r17b编译及使用ollvm-tti步骤(提供编译后文件)

    5.cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_LIBDIR_SUFFIX=64 -G "MinGW Makefiles" -DLLVM_INCLUDE_TESTS=OFF ..\ollvm-tll 6.make -j3 二、链接NDK 7.备份NDK_PATH/toolchains/llvm目录 8.删除NDK_PATH/...

    编译好的OpenCV4.0.1+Qt5.9+Contrib版

    编译教程请参考 https://blog.csdn.net/yl_best/article/details/89190142 OpenCV4.0.1 + Qt5.9.3 + CMake3.12.1 with Contrib4.0.1 without hdf module without BUILD_opencv_world Release: many dll/dll.a ...

    opencv移植到arm, 包含cmake包

    ../../lib/libopencv_highgui.so: undefined reference to `_TIFFerrorHandler' ../../lib/libopencv_highgui.so: undefined reference to `_TIFFrealloc' ../../lib/libopencv_core.so: undefined reference to `...

    编译好的OpenCV3.4.2+Qt5.9+Contrib版

    编译教程请参考 https://blog.csdn.net/yl_best/article/details/89190142 详细请参考档案中的ReadMe.txt OpenCV3.4.2 + Qt5.9.3 + CMake3.12.1 with Contrib3.4.2 without hdf module without BUILD_opencv_world ...

    HEVC开源编码器x265

    $ ./make-Makefiles.bash $ make Windows (Visual Studio) Instructions $ hg clone https://bitbucket.org/multicoreware/x265 Then run make-solutions.bat in the build\ folder that corresponds to your ...

    编译好的OpenCV3.4.2+Qt5.9

    编译教程请参考 https://blog.csdn.net/yl_best/article/details/89190142 详细请参考ReadMe.txt without contrib without BUILD_opencv_world Release: many dll/dll.a General configuration for OpenCV 3.4.2 ==...

    编译好的Opencv3.4.2+Qt5.9 BUILD_opencv_world版

    编译教程请参考 https://blog.csdn.net/yl_best/article/details/89190142 详细请参考档案中的ReadMe.txt OpenCV3.4.2 + Qt5.9.3 + CMake3.12.1 without contrib - 普通版OpenCV,不带Contrib with BUILD_opencv_...

    source.codeaurora.org.external.qoriq.qoriq-components.ceetm-ce source code

    标题"source.codeaurora.org.external.qoriq.qoriq-components.ceetm-ce source code"表明这是一个开源的源代码库,主要针对Qoriq组件中的CEETM(Control and Enhanced Event Tracing for Multi-core)模块。...

    llvm-project-llvmorg-13.0.0-centos79-gcc11.1

    1.centos7.9下编译 clang全家桶,压缩包中已...clang-tools-extra" -G "Unix Makefiles" ../llvm make # 这一步十分耗时,建议放后台跑 make install 3.备注 devtoolset-11:gcc11.1 llvm-project: clang clang lldb等

    Ubuntu 上使用C++ zxing 识别二维码

    官网下载https://cmake.org/download/ cmake 2../bootstrap make -j8 sudo make install 3.查看安装是否成功 cmake --version 出现版本即可 4.解压zxing源码包 5.make build cd build cmake -G "Unix Makefiles" ....

    WINDOW平台下安装object-c运行环境

    include $(GNUSTEP_MAKEFILES)/common.make TOOL_NAME=LogTest LogTest_OBJC_FILES=wade.m include $(GNUSTEP_MAKEFILES)/tool.make ``` 5. 在Shell中输入`make`,编译你的程序。完成后,你可以在当前目录的`obj`子...

    cmake-3.22.1-linux-x86_64.tar.gz

    它通过简洁的配置语言(CMakeLists.txt)来描述项目结构和构建规则,然后生成针对不同编译器和构建工具链的本地构建文件,如Unix Makefiles、Microsoft Visual Studio解决方案等。CMake-3.22.1-linux-x86_64.tar.gz...

    openCV2.4.4+QT+cmake搭建步骤

    点击 Configure,下拉菜单选择 MinGW makefiles,下面的 4 个选项选默认第一个,第一个选项是让 cmake 到环境变量上找,第二个选项是自定义编译器路径。 编译 OpenCV 点击 Generate 按钮,生成 makefile 文件。...

    Win7下Qt532+MinGW482+OpenCV249+Cmake302编译环境搭建

    - 官网地址:http://opencv.org 2. **下载Qt 5.3.2** - 推荐下载最新版本的Qt,本文中使用的版本为5.3.2。 - 下载地址:Qt官方网站。 3. **下载CMake** - CMake的下载地址为:http://www.cmake.org/download/ ...

    linux环境安装手册.docx

    PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" --enable-static make make install ``` - **安装libx265**:用于支持H.265视频编码。 ...

    Ubuntu 18使用笔记.docx

    - 使用CMake配置构建类型为Release:`cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release ../llvm` - 编译:`make` - 安装:`sudo make install` - 默认安装路径为`/usr/local`。 - **使用Clang编译代码**:...

Global site tag (gtag.js) - Google Analytics