没有用于 makefile 编译的 iostream,但可以正常编译

No iostream for makefile compilation but fine with regular compilation

我有这样一个文件:(p1.c)

  1 #include <iostream>                                                                                                
  5
  6 int main(int argc, char* argv[]) {
  7    std::cout << "No iostream\n";
  8    return 0;
  9 }

然后我尝试使用这样一个简单的 makefile 进行编译:

  1 app: p1.o                                                                                                          
  2     g++ p1.o -o p1
  3
  4 clean:
  5     rm *.o p1 p2

运行 make 产生这个:

p1.c:1:10: fatal error: iostream: No such file or directory
 #include <iostream>
          ^~~~~~~~~~
compilation terminated.
<builtin>: recipe for target 'p1.o' failed
make: *** [p1.o] Error 1

但是 运行 g++ p1.c 工作正常,没有问题。

我在 make 文件中做错了什么吗?除了 iostream 之外,我对库没有其他问题。

您只指定了 Makefile 规则 link 目标文件为可执行文件。您实际上没有指定将源代码文件编译为目标文件的规则。

因此 make 将尝试使用隐式规则从 p1.c.

构建目标文件 p1.o

因为p1.c有一个以.c结尾的文件,它会假定该文件是C源代码并调用cc编译它,这应该是一个C编译器,而不是一个C++ 编译器。

在C中没有<iostream>所以编译失败。

将文件名从 p1.c 更改为 p1.cppp1.cxxp1.cc 或其他一些 C++ 的常规文件结尾。当 .c 文件实际上不包含 C 源代码时,它不仅让 make 感到困惑,而且让其他程序员感到困惑。