我有一个问题:
我正在创建一个像这样的库:
myLibrary.h
class MyLibrary{
public:
MyLibrary(int);
private:
int myInt;
}
myLibrary.cpp
#include "myLibrary.h"
MyLibrary::MyLibrary(int i){
this->myInt = i;
}
main.cpp
#include "myLibrary.h"
int main(){
MyLibrary library(10);
}
如果我现在像这样做我的 Makefile:
all:
g++ -o library.o -c myLibrary.cpp
g++ -o main.o -c main.cpp
g++ -o main.out main.o library.o
一切正常,但是我该怎么做,当我将这个库提供给其他人在他的代码中使用它时,他只需要输入他的程序 #include "myLibrary.h"
就是这样。所以我不想让他在他的 makefile 中为我的库中的每个 c++ 文件键入所有 g++ 调用,有没有办法将 makefile 包含到其他 makefile 或其他文件中?
我知道这可能听起来像是一个愚蠢的问题,但如果您能帮助我,那就非常温和了。
最佳答案
您不让库编译其 header 。
header 不会被编译,源代码文件会被编译,它们包含 header 。
并且您无法实现您的库的用户“只需输入他的程序#include“myLibrary.h”
就可以了”,这是不可能的。
正如您可能已经了解到的那样,在使用任何非标准库(即未随工具链/编译器附带的库)时,您必须设置项目,以便链接器使用库的二进制部分。
严格来说,如果您手动声明所需的原型(prototype)等,甚至可以在没有任何 header 的情况下使用该库(如果链接)。不明智,但有可能。
您的 makefile 显示您不是在创建库,您只是从两个源代码文件构建一个程序,其中一个在 header 中有意义地具有其声明。
抱歉地说,但是您可能正在尝试做的事情,创建一个库(共享、DLL、静态等)以供重用,它更加复杂。我建议搜索“创建 XXXX 库”,XXXX 就是该库的类型。解释差异以及如何创建不同类型太复杂,无法在此处的旁注中进行介绍,并且超出了回答所提出的问题的范围。
请理解,我考虑澄清我认为您的相关误解是对您问题的答案,并且“操作方法”在我看来是一个不同的、在其他地方已经回答过的问题。
但是,从用户“bloody”的评论中获取适用的反馈:
如果您没有考虑我上面提到的那种库,并考虑头文件和不需要编译的文件的组合,那么您实际上已经完成了所显示的内容。如果您提供编译“myLibrary.cpp”产生的“library.o”文件,那么用户可以像您在显示的 makefile 的最后一行中那样使用它。这可以被认为是一个静态库。
(严格来说,它并不真正符合您的描述“只需输入他的程序#include“myLibrary.h”
就可以了”。)
关于c++ - 如何让库编译它的头文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65633951/