gcc/g++多文件编译

初级版

目录如下:

 

 header.h

#include <iostream>
#include <stdio.h>

void one();
void two();

main.cpp

#include "header.h"

int main(){
    printf("hello
");
    one();
    two();

    return 0;
}

funcA.cpp

#include "header.h"

void one(){
    printf("im one from A 
");
}

funcB.cpp

#include "header.h"

void two(){
    printf("im two from B 
");
}

测试1.1:

只编译main.cpp

测试1.2:

编译所有cpp

测试1.3:

编译为静态库

 说明:

g++ -c *.cpp 把cpp文件编译为.o的对象

ar 命令把.o的对象打包为libfunc.a的静态库

最后编译的时候指定该静态库

g++ main.cpp -o main libfunc.a

测试1.4

编译为动态库

 说明:

-shared参数把多个cpp文件编译为so动态库

编译main的时候指定该库就可以了。

注意:

如果funcA.cpp需要用funcB.cpp里面的函数或者定义,则需要在funcA.cpp里面引用funcB.h,如果只是在main.cpp里面引用funcB.h是没用的。

因为g++的编译是每个cpp编译为一个个独立的object,最后再链接起来。

比如我在main.cpp里面把所有的头文件都引入进来,后面cpp用的某个头文件时,如果不引用,也是会编译不过的。

进阶版:

如果有多目录g++ *.cpp的方式就不行了,需要指定其他目录下的所有cpp,这个比较麻烦,所以有其他路子

测试2.1

编译所有文件

 说明:

文件少的时候也能凑合,编译静态和动态库也同理。

测试2.2

makefile

@todo

原文地址:https://www.cnblogs.com/alazalazalaz/p/13822162.html