【发布时间】:2021-12-30 12:00:45
【问题描述】:
我正在尝试开发一个使用外部 .a 静态库的应用程序。
由于这个外部库文件中已经定义了符号,有没有办法跳过使用它的.cpp源文件中头文件的include语句?
换句话说 - 如果我已经有了 .a 文件,为什么还需要 .h 文件?
提前致谢
【问题讨论】:
我正在尝试开发一个使用外部 .a 静态库的应用程序。
由于这个外部库文件中已经定义了符号,有没有办法跳过使用它的.cpp源文件中头文件的include语句?
换句话说 - 如果我已经有了 .a 文件,为什么还需要 .h 文件?
提前致谢
【问题讨论】:
是的,你必须这样做。
编译器需要知道库使用的数据类型,需要知道函数使用什么参数以及返回值是什么类型。它还需要知道库使用的全局对象。
换句话说 - 如果我已经有 .a 文件,我为什么需要 .h 文件?
编译器不使用目标文件来检索有关函数、数据或类型的信息。您需要在源代码中指定它。目标文件不是 C 语言的一部分。
您不需要.h 文件。您还可以在源代码中键入声明、函数原型。 .h 文件可以包含在您的源代码中,并在其他源代码文件中重复使用。
【讨论】:
你可以这样做:
#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 的签名。
【讨论】:
使用外部库时是否必须包含头文件?
从技术上讲,您不必这样做。但是头文件将使库的使用更加容易。
为什么我需要 .h 文件?
头文件声明并在某些情况下定义类型、函数和变量。
如果您可以导入模块,则不一定需要包含标头。
【讨论】:
编译器需要知道您从库中使用的资源的签名。这可以通过包含适当的头文件或自己提供签名来完成。
您不需要包含头文件,只要您为您从库中使用的资源提供签名/原型即可。
【讨论】:
总是这样。您还可以使用#include 添加现有功能。并且编译器将为您包含特定的文件。
【讨论】: