C++ 和 Makefile 筆記

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聲明開頭都不能用空白字符

相關文章
相關標籤/搜索