没有用于 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.cpp
或 p1.cxx
或 p1.cc
或其他一些 C++ 的常规文件结尾。当 .c
文件实际上不包含 C 源代码时,它不仅让 make
感到困惑,而且让其他程序员感到困惑。
我有这样一个文件:(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.cpp
或 p1.cxx
或 p1.cc
或其他一些 C++ 的常规文件结尾。当 .c
文件实际上不包含 C 源代码时,它不仅让 make
感到困惑,而且让其他程序员感到困惑。