我非常了解在linux环境下使用g ++编译C ++程序。但是,可能是我遗漏了一些东西,我得到了这种奇怪的输出/行为。
我在test.cpp中有源文件。 为了编译这个,我做了
(1) g++ -c test.cpp g++ -o test test.o ./test
一切正常。 但是当我在同一阶段进行编译和链接时,就像这样
(2) g++ test.cpp -o test ./test => Works fine (3) g++ -c test.cpp -o test => Doesn't work
在我的最后一个案例中,测试已生成但不再可执行;但在我的猜测它应该工作正常。 那么,有什么问题或者我需要更改一些设置/配置吗?
我正在使用g ++ 4.3.3
感谢。
答案 0 :(得分:12)
当你说:
g++ -c test.cpp -o test
-c标志禁止链接,因此不会生成可执行文件 - 您正在重命名.o文件。
基本上,不要这样做。
答案 1 :(得分:3)
您正在强制编译器生成目标文件,并将其命名为可执行文件。
基本上你的最后一行告诉:将其编译为目标文件,但将其命名为test,而不是test.obj。
答案 2 :(得分:3)
-c标志表示仅编译
尝试 g ++ -o test test.cpp
答案 3 :(得分:2)
在g ++命令行中指定-o
会告诉编译器为输出文件指定的名称。当您尝试在一行中完成所有操作时,您只是告诉编译器将test.cpp
编译为名为test
的目标文件,并且没有完成链接。
查看精彩的online manual for GCC了解详情。
答案 4 :(得分:1)
来自gcc手册:
-c Compile or assemble the source files, but do not link. The linking stage simply is not done. The ultimate output is in the form of an object file for each source file.
您必须链接已编译的目标文件才能获取可执行文件。 有关编译和链接的更多信息和内容是here。
答案 5 :(得分:1)
阅读man g ++。交换机-c只是编译而不是链接。 g ++ -c test.cpp -o test 做什么 g ++ -c test.cpp 但是对象文件将被测试而不是默认名称test.o.无法执行目标文件。