c++ - 如何让库编译它的头文件

标签 c++ makefile

我有一个问题:

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

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/

相关文章:

ios - ranlib 缺少在 iOS 上编译 GNU bash

node.js - 通过 Node.js 调用嵌套文件夹中的 Make 文件

c++ - libstdc++ : DSO missing from command line

c++ - 当 const ref 被原始对象(非常量)替换时,const-ness 会消失吗?

c++ - 如何在 C++ 中创建高效的多线程任务调度程序?

c++ - 有什么好的方法可以指示计算机是否可以运行特定的程序/软件?

makefile - 如何一起替换 .c 和 .cpp 文件?

c++ - 使用 C++/WinRT 制作一个简单的消息框

c++ - 在 Cmakelist 中添加 Arpack/Armadillo

c - 带有内核镜像或 boot.img 的内置 Linux 应用程序