如何通过终端编译和运行使用多个文件的程序



所以我正在尝试练习和学习如何使用文本编辑器和命令行界面(Mac 上的终端),但我在编译它时遇到了麻烦。我用 c++ 编写,我将主文件、类和类定义分成多个文件。我想使用终端编译和运行程序,但遇到了问题。我使用

 g++ file1.cpp file2.cpp file3.h -o run 

编译,我收到错误消息"生成多个输出文件时无法指定 -o"。

我打算在这个程序中拥有更多的文件,不知道这是否是每次编译的最佳方式?无论如何,我如何编译这个程序以便我可以运行?我知道该程序没有任何错误,因为我在 IDE Xcode 中对其进行了测试。

如果你真的需要,你可以键入几个命令(-std=c++11告诉编译器它是C++11代码,-Wall要求几乎所有的警告,-Wextra要求更多的警告,-g询问调试信息,-c避免链接步骤)

 g++ -std=c++11 -Wall -Wextra -g -c file1.cpp
 g++ -std=c++11 -Wall -Wextra -g -c file2.cpp
 g++ -std=c++11 -Wall -Wextra -g -c file3.cpp

这些命令file1.ofile2.ofile3.o生成目标文件,您可以链接这些文件以制作可执行文件:

 g++ -std=c++11 -g file1.o file2.o file3.o -o run

顺便说一句,您可以在一个命令中运行所有命令:

 g++ -std=c++11 -Wall -Wextra -g file1.cpp file2.cpp file3.cpp -o run

但这不是最佳选择(因为通常您一次编辑一个文件,而其他文件可能不需要重新编译)。

但是你真的想使用GNU make,通过编写你的Makefile(见这个例子)并简单地用make编译;如果你只改变file2.cpp那么make会注意到只有file2.o需要再生(以及最后的链接再次制作run

无需编译头文件(它们由g++编译器预处理)。您可能对预编译标头和生成文件依赖项感兴趣。

一旦你的程序被调试(在像gdb和valgrind这样的调试器的帮助下),你可以要求编译器通过将-g替换为-O-O2来进行优化(你甚至可以用两个-g -O进行编译)。如果你对你的程序进行基准测试(例如,用time),不要忘记要求编译器进行优化!

附言。您的g++命令可能需要更多参数,例如 -I......要添加包含目录,-DNAME定义预处理器名称,-L...要添加库目录,-l...链接库,参数顺序对g++很重要

最新更新