【发布时间】:2013-11-27 14:45:27
【问题描述】:
是否可以看到 gcc 和 g++ 编译过程背后发生了什么?
我有以下程序:
#include <stdio.h>
#include <unistd.h>
size_t sym1 = 100;
size_t *addr = &sym1;
size_t *arr = (size_t*)((size_t)&arr + (size_t)&addr);
int main (int argc, char **argv)
{
(void) argc;
(void) argv;
printf("libtest: addr of main(): %p\n", &main);
printf("libtest: addr of arr: %p\n", &arr);
while(1);
return 0;
}
为什么使用 g++ 生成二进制文件却没有错误,而使用 gcc 有错误?
我正在寻找一种方法来追踪导致它们行为不同的原因。
# gcc test.c -o test_app
test.c:7:1: error: initializer element is not constant
# g++ test.c -o test_app
我认为原因实际上可能是 gcc 使用 cc1 作为编译器,而 g++ 使用 cc1plus。
有没有办法更精确地输出实际所做的事情?
我尝试使用 -v 标志,但输出非常相似。是否有不同的标志传递给链接器?
比较两个编译过程并找出它们之间的差异的最简单方法是什么?
【问题讨论】:
-
因为
C!=C++. -
其中一个原因是它们链接到不同的库。
-
因为 gcc 编译 c 代码而 g++ 编译 c++ 代码,它们是相似的,但仍然是不同的语言。我不是专家,但我的猜测只是你在那里尝试的东西(将非常量分配给全局)在 c 中根本不可能。
-
请查看主题中的实际问题(不仅是标题):-) 我想知道一些方法来输出编译过程中发生的事情。使用了哪些子程序,传递了哪些标志,链接了哪些库......我想看看一些背景......
-
@MikhailKalashnikov 将 -v 标志添加到 gcc 或 g++
标签: c++ c gcc compiler-construction