【问题标题】:How to make library compile its headers [duplicate]如何使库编译其标头[重复]
【发布时间】:2021-04-14 10:52:38
【问题描述】:

我有一个问题:

我正在创建一个这样的库:

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中?

我知道这听起来可能是个愚蠢的问题,但如果你能帮助我,那将是非常温和的。

【问题讨论】:

  • 在某种程度上你创建了一个合法的静态库library.o。你可以把它连同它的头文件一起提供给任何人,他们可以链接到它(他们仍然需要知道如何链接)。他们的makefile 然后至少不再需要这行g++ -o library.o -c myLibrary.cpp 因为你已经编译了它。
  • @bloody 我刚刚发现你在这里评论“感动”。我接受它,实际上已将其纳入我的答案。你同意吗?
  • @Yunnosch 当然,没问题,我也在你的帖子下解释了自己。感谢您的信息:)

标签: c++ makefile


【解决方案1】:

你不要让库编译它的头文件。
头文件不编译,源代码文件是,它们包含头文件。

而且您无法实现您图书馆的用户“只需输入他的程序 #include "myLibrary.h" 就可以了”,这是不可能的。
正如您在使用任何非标准库(即工具链/编译器未附带的库)时可能了解到的那样,您必须设置您的项目,以便链接器使用库的二进制部分。
严格来说,如果您要手动声明所需的原型等,甚至可以在没有任何标题的情况下使用库(如果已链接)。不明智,但可能。

您的 makefile 表明您不是在创建库,您只是从两个源代码文件构建程序,其中一个在标头中有意义地声明了它的声明。

很抱歉,但您可能正在尝试做的事情是创建一个库(共享、dll、静态等)以供重用,它更复杂。我建议搜索“创建 XXXX 库”,其中 XXXX 是那种库。解释差异以及如何创建不同类型太复杂了,无法在此处的旁注中介绍,并且超出了按要求回答问题的范围。

请理解,我考虑澄清我认为您的相关误解是对您问题的回答,并且在我看来,“操作方法”是一个不同的并且在其他地方已经回答的问题。

但是,从用户“血腥”的评论中获取适用的反馈:
如果您不考虑我上面提到的那种库,而是考虑头文件和不需要编译的文件的组合,那么您实际上已经完成了您所展示的内容。如果您提供通过编译“myLibrary.cpp”生成的“library.o”文件,那么用户可以像在显示的 makefile 的最后一行中那样使用它。这可以被认为是一个静态库。
严格来说,它与您对“只需输入他的程序 #include "myLibrary.h" 就可以了”的描述并不完全相符。

【讨论】:

  • 如果库很小,您可以将其全部放在头文件中 - 但要注意它是否有任何全局或静态变量,因为它们会失败
  • @mmmmmm 我承认一般只有标题的可能性并批准建议的重复。但是,我觉得 OP 没有考虑过这种情况,我的回答仍然具有对误解进行分类的价值。
猜你喜欢
  • 2023-03-27
  • 2019-09-01
  • 2021-02-20
  • 2016-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-27
相关资源
最近更新 更多