专栏首页信息安全小学生C++ 和 Makefile 笔记

C++ 和 Makefile 笔记

C++:

编译单个文件:

Hello.cpp:

#include <stdio.h>

int main(void) {
	printf("Hello, world!\n");
	return 0;
}

编译:

g++ -g -Wall hello.cpp -o hello

编译多个文件:

定义三个文件 hello.cpp, hello_fn.cpp, hello.h

hello.h:

void hello(const char* name);

hello_fn.cpp

#include <stdio.h>
#include "hello.h"

void hello(const char* name) {
	printf("Hello, %s!\n", name);
}

hello.cpp

#include "hello.h"

int main(void) {
	hello("Gintama");
	return 0;
}

编译:

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声明开头都不能用空白字符

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • SQL Server 数据表复制

    有数据表 A, 希望将他的内容导出到另一张表 B,此时 B 并未创建,希望在导出的同时创建表 B。

    tonglei0429
  • 利用 v7 Toolbar 自定义 Android ActionBar

    要使用 Toolbar,首先要在 layout 里面添加组件,例如在 activity_main.xml 里添加

    tonglei0429
  • ADT Plugin for eclipse 最新下载地址(2015年10月)

    tonglei0429
  • C代码调用C++函数

    编译为动态链接库 g++ -fPIC -shared -o libhello.so hello.cpp

    十毛
  • 为什么建议你常阅读源码?

    自身智力一般,技术迭代又非常快,为不至于总处于入门水平,给自己定位是后端,进一步定位现阶段是 web后台开发。

    谢伟
  • 【DB笔试面试647】在Oracle中,使用SPLIT来拆分某个分区的时候,其拆分出来的新分区的统计信息行数是多少?

    在Oracle中,使用SPLIT来拆分某个分区的时候,其拆分出来的新分区的统计信息行数是多少?

    小麦苗DBA宝典
  • 微信跳一跳iOS安卓机怎么进入?进不去怎么办?

    微信跳一跳iOS安卓版进不去怎么办?听着身边的朋友说,微信出了一个小游戏,叫做跳一跳,这个游戏有点像儿时的跳房子,手指长按屏幕“i”形小人就会躬身蓄力,松开后翻...

    企鹅号小编
  • 极端情况下收缩 Go 进程的线程数

    除了 allgs 之外,当前 Go 创建的线程也是没法退出的,比如这个来自 xiaorui.cc 的例子,我简单做了个修改,能从网页看到线程:

    梦醒人间
  • python数据科学系列:pandas入门详细教程

    前2篇分别系统性介绍了numpy和matplotlib的入门基本知识,今天本文自然是要对pandas进行入门详细介绍,通过本文你将系统性了解pandas为何会有...

    luanhz
  • 极端情况下收缩 Go 进程的线程数

    除了 allgs 之外,当前 Go 创建的线程也是没法退出的,比如这个来自 xiaorui.cc 的例子,我简单做了个修改,能从网页看到线程:

    范蠡

扫码关注云+社区

领取腾讯云代金券