如何仅编译 .cpp 文件为目标文件而不调用链接器?

26

我想单独编译一个 .cpp 文件而不参与整个构建过程。

如果我进行完整的构建,则编译步骤将输出到创建项目时配置的目录。

然而,如果我仅要求进行编译,则对象文件最终会被放置在与源文件相同的目录中。更糟糕的是,它会在执行编译时将对象文件链接到可执行文件上。

请注意,我正在使用 clang++ 进行 C++11 编译,但我认为这并不影响为什么它会第二次调用 Clang++.exe 进行链接,而该链接操作并未被请求。

编辑1

在进行构建时,它会执行以下操作:

-------------- Build: Debug in GOTW (compiler: GNU GCC Compiler)---------------

clang++.exe -Wall -fexceptions  -g  -std=c++11 -stdlib=libstdc++    -c                
C:\Work\test\2010\C++11\CLang\GOTW\gotw.cpp -o obj\Debug\GOTW.o
clang++.exe  -o bin\Debug\GOTW.exe obj\Debug\GOTW.o    
Output size is 203.50 KB
Process terminated with status 0 (0 minutes, 11 seconds)
0 errors, 6 warnings (0 minutes, 11 seconds)

然而,当执行“编译当前文件”时,它会执行以下操作:

clang++.exe -std=c++11 -stdlib=libstdc++    -c GOTW.cpp -o GOTW.o
1 warning generated.
clang++.exe  -o GOTW.exe GOTW.o   

我不理解为什么它会输出第二步的内容,以及如何让它像构建一样使用 obj 和 bin 目录。

大多数构建系统都可以输出它们正在执行的确切命令。尝试找到相关选项,获取命令并适当更改以获得所需的输出。 - Fred Foo
Codeblocks 输出了确切的命令,只是它执行的命令比预期多,而且它忽略了与输出目录相关的构建设置。 - Peter Nimmo
奇怪的是,如果我添加第二个源文件并要求编译它,那么a) 它会停止调用链接器,b) 它会编译到构建目录而不是直接编译到源代码所在的位置。 - Peter Nimmo
我不知道Codeblocks是否试图聪明地分析主文件是否具有main()入口点,因此调用链接器。我将尝试交换main()入口点的位置。 - Peter Nimmo
有趣的问题,你交换了main()入口后注意到任何不同了吗? - abasu
@abasu - 然后它出现了链接问题(尽管我不想它链接),因为它找不到wMain。 - Peter Nimmo
2个回答

29

使用-c选项。

-c

运行以上所有步骤,加上汇编器,生成一个目标".o"对象文件。


4

g++ -c *.cpp
这个命令将 .cpp 文件编译成 .o 文件


这是一个正确的陈述,但它并没有回答问题。你读了问题还是只看了标题? - Rob Kennedy

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