【问题标题】:Do i have to include a header file when using an external library?使用外部库时是否必须包含头文件?
【发布时间】:2021-12-30 12:00:45
【问题描述】:

我正在尝试开发一个使用外部 .a 静态库的应用程序。

由于这个外部库文件中已经定义了符号,有没有办法跳过使用它的.cpp源文件中头文件的include语句?

换句话说 - 如果我已经有了 .a 文件,为什么还需要 .h 文件?

提前致谢

【问题讨论】:

    标签: c++ c


    【解决方案1】:

    是的,你必须这样做。

    编译器需要知道库使用的数据类型,需要知道函数使用什么参数以及返回值是什么类型。它还需要知道库使用的全局对象。

    换句话说 - 如果我已经有 .a 文件,我为什么需要 .h 文件?

    编译器不使用目标文件来检索有关函数、数据或类型的信息。您需要在源代码中指定它。目标文件不是 C 语言的一部分。

    您不需要.h 文件。您还可以在源代码中键入声明、函数原型。 .h 文件可以包含在您的源代码中,并在其他源代码文件中重复使用。

    【讨论】:

      【解决方案2】:

      你可以这样做:

      #a.cpp
      #include <iostream>
      void who_are_you()
      {
          std::cout << "I am A\n";
      }
      
      
      #b.cpp
      #include <iostream>
      void who_are_you()
      {
          std::cout << "I am B\n";
      }
      
      
      #main.cpp
      #include <iostream>
      void who_are_you();
      
      int main()
      {
         std::cout << "who_are_you()\n";
         who_are_you();
         return 0;
      }
      

      然后

      g++ -c a.cpp
      g++ -c b.cpp
      ar -r libA.a a.o
      ar -r libB.a b.o
      g++ main.cpp libA.a -o withA
      g++ main.cpp libB.a -o withB
      

      ./withA 的输出将是

      who_are_you()
      I am A
      

      ./withB 的输出将是

      who_are_you()
      I am B
      

      但通常@0___________ 的答案是正确的,您必须这样做。 如果你注意到我们在主文件中定义了 who_are_you 的签名。

      【讨论】:

        【解决方案3】:

        使用外部库时是否必须包含头文件?

        从技术上讲,您不必这样做。但是头文件将使库的使用更加容易。

        为什么我需要 .h 文件?

        头文件声明并在某些情况下定义类型、函数和变量。


        如果您可以导入模块,则不一定需要包含标头。

        【讨论】:

          【解决方案4】:

          编译器需要知道您从库中使用的资源的签名。这可以通过包含适当的头文件或自己提供签名来完成。

          您不需要包含头文件,只要您为您从库中使用的资源提供签名/原型即可。

          【讨论】:

            【解决方案5】:

            总是这样。您还可以使用#include 添加现有功能。并且编译器将为您包含特定的文件。

            【讨论】:

              猜你喜欢
              • 2014-12-26
              • 1970-01-01
              • 2013-06-22
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多