编译动态库时只需要知道函数的声明,与可执行文件不同
在编译动态库的时候,不需要知道函数的实现,只需要知道函数的声明就可以。
编译可执行文件的时候,需要知道函数的实现。
文件说明:
hello.h:声明了一个类Hello,只是声明,不是实现
hello.c:类的实现,定义了Hello构造函数和Say函数的实现
lib.c:包含了hello.h头文件,并且创建了Hello,执行了Say函数
main.c:包含了hello.h头文件,并且创建了Hello,执行了Say函数
通过g++ -fPIC -shared -o libhello.so lib.c编译动态库,可以编译成功,编译过程并不会去找构造函数Hello和Say函数的实现。
通过g++ main.c编译可执行文件就会报错,提示找不到Hello和Say的实现。
hello.h
class Hello {
public:Hello(int const &data);void Say();int data_;
};
hello.c
#include <iostream>
#include <string>
#include "hello.h"Hello::Hello(int const &data) {data_ = data;
}void Hello::Say() {std::cout << "data " << data_ << std::endl;
}
lib.c
#include "hello.h"void Do() {Hello hello{10};hello.Say();return;
}
main.c
#include <istream>
#include <string>
#include "hello.h"int main() {Hello hello{10};hello.Say();return 0;
}
