Top Banner
寫程式?那些老師沒教的事 Code Smart, Don’t Code Hard Special Release
18

Code Smart - Makefile (special release)

Jul 10, 2015

Download

Business

Yu-Chuan Pi
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Code Smart - Makefile (special release)

寫程式?那些老師沒教的事Code Smart, Don’t Code Hard

Special Release

Page 2: Code Smart - Makefile (special release)

程式碼

執行檔

?

Page 3: Code Smart - Makefile (special release)

程式碼

執行檔

編譯組譯連結

Page 4: Code Smart - Makefile (special release)

程式碼

執行檔

GCC

Page 5: Code Smart - Makefile (special release)

你可能只會....

$ gcc -o hw1 hw1.c

Page 6: Code Smart - Makefile (special release)

你說不定還會....

$ gcc -o hw2 main.c a.c b.c

Page 7: Code Smart - Makefile (special release)

多檔分別編譯

$ gcc -c main.c #產生main.o$ gcc -c a.c #產生a.o$ gcc -c b.c #產生b.o$ gcc -o hw2 main.o a.o b.o

Page 8: Code Smart - Makefile (special release)

像是這樣編譯....?

g++ -c -pipe -g -Wall -W -D_REENTRANT -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtOpenGL -I/usr/include/qt4 -I../shared -I/usr/X11R6/include -I. -o glwidget.o glwidget.cppg++ -c -pipe -g -Wall -W -D_REENTRANT -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtOpenGL -I/usr/include/qt4 -I../shared -I/usr/X11R6/include -I. -o main.o main.cppg++ -c -pipe -g -Wall -W -D_REENTRANT -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtOpenGL -I/usr/include/qt4 -I../shared -I/usr/X11R6/include -I. -o window.o window.cppg++ -c -pipe -g -Wall -W -D_REENTRANT -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtOpenGL -I/usr/include/qt4 -I../shared -I/usr/X11R6/include -I. -o qtlogo.o qtlogo.cpp/usr/bin/moc-qt4 -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtOpenGL -I/usr/include/qt4 -I../shared -I/usr/X11R6/include -I. glwidget.h -o moc_glwidget.cppg++ -c -pipe -g -Wall -W -D_REENTRANT -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtOpenGL -I/usr/include/qt4 -I../shared -I/usr/X11R6/include -I. -o moc_glwidget.o moc_glwidget.cpp/usr/bin/moc-qt4 -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtOpenGL -I/usr/include/qt4 -I../shared -I/usr/X11R6/include -I. window.h -o moc_window.cppg++ -c -pipe -g -Wall -W -D_REENTRANT -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtOpenGL -I/usr/include/qt4 -I../shared -I/usr/X11R6/include -I. -o moc_window.o moc_window.cppg++ -o hellogl glwidget.o main.o window.o qtlogo.o moc_glwidget.o moc_window.o -L/usr/lib -L/usr/X11R6/lib -lQtOpenGL -lQtGui -lQtCore -lGLU -lGL -lpthread

Page 9: Code Smart - Makefile (special release)

Make?

聰明、靈活、有彈性

方便、快速、防手殘

Page 10: Code Smart - Makefile (special release)

Makefile

Page 11: Code Smart - Makefile (special release)

Makefile的基本原則

# #開頭的表示它是註解

targets: prerequisites recipe ...一個tab字元!

} 處理方式目標 先決條件

Page 12: Code Smart - Makefile (special release)

簡單的Makefile

# 大家好我是註解

hw1: hw1.c gcc -o hw1 hw1.c echo “編譯完成”

Page 13: Code Smart - Makefile (special release)

多檔編譯

# 大家好我是註解的弟弟(也是註解)

main.o: main.c gcc -c main.ca.o: a.c gcc -c a.cb.o: b.c gcc -c b.chw1: main.o a.o b.o gcc -o hw1 main.o a.o b.o

Page 14: Code Smart - Makefile (special release)

使用變數

CC = gcc

main.o: main.c $(CC) -c main.ca.o: a.c $(CC) -c a.cb.o: b.c $(CC) -c b.chw1: main.o a.o b.o $(CC) -o hw1 main.o a.o b.o

Page 15: Code Smart - Makefile (special release)

神祕的符號 - 自動變數

CC = gcc

%.o: %.c $(CC) -c $<

hw1: main.o a.o b.o $(CC) -o $@ main.o a.o b.o

第一個prerequisite

target

pattern rule

Page 16: Code Smart - Makefile (special release)

善用變數

CC = gccCFLAGS = -Wall -O2OBJS = main.o a.o b.oEXEC = hw1

%.o: %.c $(CC) $(CFLAGS) -c $<

$(EXEC): $(OBJS) $(CC) $(CFLAGS) -o $@ $(OBJS)

Page 17: Code Smart - Makefile (special release)

從今以後....$ makeg++ -c -pipe -g -Wall -W -D_REENTRANT -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtOpenGL -I/usr/include/qt4 -I../shared -I/usr/X11R6/include -I. -o glwidget.o glwidget.cppg++ -c -pipe -g -Wall -W -D_REENTRANT -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtOpenGL -I/usr/include/qt4 -I../shared -I/usr/X11R6/include -I. -o main.o main.cppg++ -c -pipe -g -Wall -W -D_REENTRANT -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtOpenGL -I/usr/include/qt4 -I../shared -I/usr/X11R6/include -I. -o window.o window.cppg++ -c -pipe -g -Wall -W -D_REENTRANT -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtOpenGL -I/usr/include/qt4 -I../shared -I/usr/X11R6/include -I. -o qtlogo.o qtlogo.cpp/usr/bin/moc-qt4 -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtOpenGL -I/usr/include/qt4 -I../shared -I/usr/X11R6/include -I. glwidget.h -o moc_glwidget.cppg++ -c -pipe -g -Wall -W -D_REENTRANT -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtOpenGL -I/usr/include/qt4 -I../shared -I/usr/X11R6/include -I. -o moc_glwidget.o moc_glwidget.cpp/usr/bin/moc-qt4 -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtOpenGL -I/usr/include/qt4 -I../shared -I/usr/X11R6/include -I. window.h -o moc_window.cppg++ -c -pipe -g -Wall -W -D_REENTRANT -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtOpenGL -I/usr/include/qt4 -I../shared -I/usr/X11R6/include -I. -o moc_window.o moc_window.cpp......g++ -o hellogl glwidget.o main.o window.o qtlogo.o moc_glwidget.o moc_window.o -L/usr/lib -L/usr/X11R6/lib -lQtOpenGL -lQtGui -lQtCore -lGLU -lGL -lpthread$ _

一步搞定!

Page 18: Code Smart - Makefile (special release)

本簡報由畢玉泉 (CrBoy) <[email protected]> 製作以創用CC 姓名標示-相同方式分享 3.0 台灣 授權條款釋出歡迎任何形式之重製、散佈與修改,但請明顯標註作者姓名、ID與E-mail,並以相同授權條款將衍生作品釋出