所以我正在尝试练习并学习如何使用文本编辑器和命令行界面(mac上的终端),但是我在编译时遇到了麻烦。我用c ++编写,我将主文件,类和类定义分成多个文件。我想使用终端编译和运行程序但是遇到了问题。我用
g++ file1.cpp file2.cpp file3.h -o run
编译并收到错误消息“生成多个输出文件时无法指定-o”。
我打算在这个程序中有更多的文件,不知道这是否是每次编译的最佳方式?无论如何,我如何编译这个程序,以便我可以运行?我知道程序没有任何错误,因为我在IDE Xcode中进行了测试。
答案 0 :(得分:1)
如果你真的想要,你可以输入几个命令(-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.o
,file2.o
,file3.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
(请参阅this example)并简单地使用make
进行编译;如果您只更改file2.cpp
,那么make
会注意到只有file2.o
必须重新生成(并且最后一个链接要再次生成run
)
您不需要编译头文件(它们由g++
编译器预处理)。您可能对precompiled headers和makefile依赖generation感兴趣。
调试程序后(在gdb
和valgrind等调试器的帮助下),您可以通过替换{{{}来要求编译器执行optimizations 1}} -g
或-O
(您甚至可以使用-O2
进行编译)。如果您对程序进行基准测试(例如使用-g -O
),请不要忘记要求编译器进行优化!
PS。您的time
命令可能需要more arguments,例如g++
...添加一个包含目录,-I
来定义预处理器名称,-DNAME
...添加一个库目录,-L
...来链接一个库和参数顺序对-l