初级版
目录如下:
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