【问题标题】:How do I compile a .cpp file just to object file without calling linker如何在不调用链接器的情况下将 .cpp 文件编译为目标文件
【发布时间】:2013-05-22 17:09:00
【问题描述】:

我正在尝试与构建过程分开编译单个 .cpp 文件。

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

但是,如果我只是要求进行编译,我最终会将目标文件与源文件放在同一目录中,更糟糕的是,它会继续并将目标文件链接到可执行文件,当它应该进行编译时。

请注意,我正在为 C++11 使用 clang++ 进行编译,但我认为这不会限制为什么它会第二次调用 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)

然而,当Compile Current File 被执行时,它会这样做:

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 目录

【问题讨论】:

  • 大多数构建系统可以输出它们正在执行的确切命令。尝试找到相关选项,获取命令并进行适当更改以获取所需的输出。
  • Codeblocks 正在输出确切的命令,只是它执行的命令比预期的要多,但它也忽略了与输出目录有关的构建设置
  • 奇怪的是,如果我添加第二个源文件并要求它编译它 a) 停止调用链接器 b) 它编译到构建目录而不是直接编译到源所在的位置。
  • 我不知道 Codeblocks 是否试图聪明并分析主文件有一个 main() 入口点,因此调用链接器。我将尝试交换 main() 条目的位置
  • 有趣的问题,你注意到交换 main() 条目后有什么不同吗?

标签: c++ compilation codeblocks


【解决方案1】:

Use the -c option.

-c

运行上述所有程序,加上汇编程序,生成目标“.o” 目标文件。

【讨论】:

    【解决方案2】:

    g++ -c *.cpp 它将.cpp编译成.o

    【讨论】:

    • 这是一个真实的陈述,但它没有回答问题。您是否阅读了问题,还是仅阅读了标题?
    猜你喜欢
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 2016-05-28
    • 2015-11-03
    • 1970-01-01
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多