C++程序,使用g++编译

4
我非常了解在Linux环境下使用g++编译C++程序。但是,也许我漏掉了什么,我得到了这个奇怪的输出/行为。
我的源文件是test.cpp。 编译它的命令如下:
(1) g++ -c test.cpp g++ -o test test.o ./test
一切正常运行。但是当我将编译和链接放在同一个阶段时,如下所示:
(2) g++ test.cpp -o test ./test => 运行正常 (3) g++ -c test.cpp -o test => 无法运行
在最后一种情况下,test被生成,但不再可执行;但我猜应该可以正常工作。 那么,出了什么问题?或者我需要更改一些设置/配置吗?
我正在使用g++ 4.3.3
谢谢。
6个回答

12

当你说:

g++ -c test.cpp -o test

使用-c选项会阻止链接,因此不会生成可执行文件-您正在重命名.o文件。

基本上,请不要这样做。


3

你正在强制编译器生成一个对象文件,并将其命名为可执行文件。

实际上,你的最后一行告诉编译器:将此编译为一个对象文件,但将其命名为test,而不是test.obj。


3
-c 标志意味着仅编译,尝试使用 g++ -o test test.cpp 进行编译。

2
在g++命令行中指定-o告诉编译器输出文件的名称。当您试图在一行中完成所有操作时,您只是告诉编译器将test.cpp编译为名为test的对象文件,并且没有进行链接。请查看绝妙的GCC在线手册以获取更多详细信息。

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.

你必须链接编译后的目标文件才能得到可执行文件。有关编译、链接等更多信息可以在这里找到。


1

阅读 man g++。选项 -c 是仅编译而不链接。 g++ -c test.cpp -o test 做了什么 g++ -c test.cpp 所做的一样,但对象文件将是 test 而不是默认名称 test.o。对象文件无法执行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接