跳转至

Compile#

1 编译过程#

1.1 预处理#

示例

cpp_srcs := $(shell find src -name *.cpp)
pp_files := $(patsubst src/%.cpp,src/%.i,$(cpp_srcs))

src/%.i : src/%.cpp
    @g++ -E $^ -o $@

preprocess : $(pp_files)

clean :
    @rm -f src/*.i

debug :
    @echo $(pp_files)

.PHONY : debug preprocess clean

1.2 编译成汇编语言#

示例

cpp_srcs := $(shell find src -name *.cpp)
as_files := $(patsubst src/%.cpp,src/%.s,$(cpp_srcs))

src/%.s : src/%.cpp
    @g++ -S $^ -o $@

assemble : $(as_files)

clean :
    @rm -f src/*.s

debug :
    @echo $(as_files)

.PHONY : debug assemble clean

1.3 编译成目标文件#

示例

cpp_srcs := $(shell find src -name *.cpp)
cpp_objs := $(patsubst src/%.cpp,objs/%.o,$(cpp_srcs))

objs/%.o : src/%.cpp
    @mkdir -p $(dir $@)
    @g++ -c $^ -o $@

objects : $(cpp_objs)

clean :
    @rm -rf objs src/*.o

debug :
    @echo $(as_files)

.PHONY : debug objects clean

1.4 链接可执行文件#

cpp_srcs := $(shell find src -name *.cpp)
cpp_objs := $(patsubst src/%.cpp,objs/%.o,$(cpp_srcs))


objs/%.o : src/%.cpp
    @mkdir -p $(dir $@)
    @g++ -c $^ -o $@

workspace/exec : $(cpp_objs)
    @mkdir workspace/exec
    @g++ $^ -o $@

run : workspace
    @./$<

clean :
    @rm -rf objs workspace/exec

debug :
    @echo $(as_files)

.PHONY : debug run clean

2 编译选项#

编译选项
- -m64: 指定编译为 64 位应用程序
- -std=: 指定编译标准,例如:-std=c++11、-std=c++14
- -g: 包含调试信息
- -w: 不显示警告
- -O: 优化等级,通常使用:-O3
- -I: 加在头文件路径前
- fPIC: (Position-Independent Code), 产生的没有绝对地址,全部使用相对地址,代码可以被加载到内存的任意位置,且可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的

链接选项
- -l: 加在库名前面
- -L: 加在库路径前面
- -Wl,<选项>: 将逗号分隔的 <选项> 传递给链接器
- -rpath=: "运行" 的时候,去找的目录。运行的时候,要找 .so 文件,会从这个选项里指定的地方去找

3 Implicit Rules#

  • CC: Program for compiling C programs; default cc
  • CXX: Program for compiling C++ programs; default g++
  • CFLAGS: Extra flags to give to the C compiler
  • CXXFLAGS: Extra flags to give to the C++ compiler
  • CPPFLAGS: Extra flags to give to the C preprocessor
  • LDFLAGS: Extra flags to give to compilers when they are supposed to invoke the linker

4 编译带头文件的程序#

add.hpp

#ifndef ADD_HPP
#define ADD_HPP
int add(int a, int b);

#endif // ADD_HPP

add.cpp
int add(int a, int b)
{
    return a+b;
}

minus.hpp
#ifndef MINUS_HPP
#define MINUS_HPP
int minus(int a, int b);

#endif // MINUS_HPP

minus.cpp
int minus(int a, int b)
{
    return a-b;
}

main.cpp
#include <stdio.h>
#include "add.hpp"
#include "minus.hpp"

int main()
{
    int a=10; int b=5;
    int res = add(a, b);
    printf("a + b = %d\n", res);
    res = minus(a, b);
    printf("a - b = %d\n", res);

    return 0;
}

Makefile

cpp_srcs := $(shell find src -name *.cpp)
cpp_objs := $(patsubst src/%.cpp,objs/%.o,$(cpp_srcs))

# 你的头文件所在文件夹路径(建议绝对路径)
include_paths := 
I_flag        := $(include_paths:%=-I%)


objs/%.o : src/%.cpp
    @mkdir -p $(dir $@)
    @g++ -c $^ -o $@ $(I_flag)

workspace/exec : $(cpp_objs)
    @mkdir -p $(dir $@)
    @g++ $^ -o $@ 

run : workspace/exec
    @./$<

debug :
    @echo $(I_flag)

clean :
    @rm -rf objs

.PHONY : debug run