C++:ios
編譯單個文件:ui
Hello.cpp:spa
#include <stdio.h> int main(void) { printf("Hello, world!\n"); return 0; }
編譯:命令行
g++ -g -Wall hello.cpp -o hello
編譯多個文件:code
定義三個文件 hello.cpp, hello_fn.cpp, hello.hip
hello.h:ci
void hello(const char* name);
hello_fn.cppget
#include <stdio.h> #include "hello.h" void hello(const char* name) { printf("Hello, %s!\n", name); }
hello.cppit
#include "hello.h" int main(void) { hello("Gintama"); return 0; }
編譯:io
g++ -Wall hello.cpp hello_fn.cpp -o hello2
連接外部庫
extlib.cpp(使用了 math.h, /usr/lib/libm.a)
#include <math.h> #include <stdio.h> int main(void) { double x = 1.0; double y = cos(x); printf("Cos(1.0) is: %f\n", y); return 0; }
編譯:
g++ -Wall extlib.cpp /usr/lib/libm.a -o extlib
或者
g++ -Wall extlib.c -lm -o extlib
-lm = /usr/lib/libm.a
-l 表明鏈接, m 表明 lib(m).a 中的 m
Makefile:
基本格式:
target1 ... : prerequisites ... command target2 ... : prerequisites ... command
其中第一個 target 爲默認執行。
上述示例轉換成 makefile
CC=g++ CFLAGS=-Wall hello:hello.o hello_fn.o clean: rm -f hello hello.o hello_fn.o
使用 VPATH 搜索路徑
好比工程目錄下,將CPP文件放置在 src 目錄下,H文件放在 header下,則makefile能夠這樣寫
CC = g++ OBJ = main_fn.o main.o CFLAGS = -I include vpath %.cpp src vpath %.h include main:$(OBJ) $(CC) -o $@ $(OBJ) %.o:%.cpp $(CC) $(CFLAGS) -c $< .PHONY:clean clean: -rm -f main $(OBJ)
其中,vpath 是搜索文件通配符和搜索路徑
CFLAGS = -I include 是必須得,由於
include/main.h
#ifndef __MAIN_H #define __MAIN_H extern void echo(void); #endif
src/main_fn.cpp
#include <iostream> #include "main.h" void echo(void) { std::cout << "echo ..." << std::endl; }
src/main.cpp
#include <iostream> #include "main.h" int main() { std::cout<< "helloworld" << std::endl; echo(); return 0; }
makefile 中有三個變量
$@--目標文件,$^--全部的依賴文件,$<--第一個依賴文件。
加入有如下 TARGET
main:main.o foo.o
gcc -o $@ $^
等價於
gcc -o main main.o foo.o
常見錯誤:
1.
現象:Makefile:1: *** missing separator. Stop.
辦法:Makefile中只有命令行須要以 TAB 開頭
2.
現象:*** recipe commences before first target. Stop.
辦法:Makefile的Target聲明開頭都不能用空白字符