Questions tagged «gcc»

GCC是GNU编译器集合。它是Linux上针对C,C ++,Go,Fortran和Ada的事实上的标准编译器,并且还支持许多其他语言和平台。除编译器外,GCC还具有一个工具链(libc,libstdc ++,objdump,nm等),该工具链已在多个平台和系统上广泛使用。

3
使用命令行选项包括头文件吗?
是否可以在命令行中指定要包含的其他头文件(使用GCC 4 / C ++)? 或者除了#include以外,还有其他方法可以包含文件吗? 背景:我正在尝试在自己的PC上编译大型代码库。该代码通常是在具有复杂构建系统的集群中编译的(SoftRelTools是否有人吗?),该系统与操作系统交织在一起,因此几乎不可能将其安装在其他位置(字面上有数百个makefile和shell脚本,而且很难网络驱动器的编码路径)。但是,实际的代码相当简单,并且可以很好地编译,但是它缺少很多包含(主要是la“ include <vector>”和“ include <math.h>”)。我猜想构建系统通常会解决这个问题,但是我必须遍历代码并手动添加包含,这是我希望避免的。
78 c++  gcc  include 

4
包含文件的存储位置-Ubuntu Linux,GCC
因此,当我们执行以下操作时: #include <stdio.h> 与 #include "myFile.h" 编译器(在我的情况下为GCC)知道stdio.h(甚至是目标文件)在我的硬盘上的位置。它只是利用文件,而没有我的参与。 我认为在我的Ubuntu Linux机器上,文件存储在/usr/include/。编译器如何知道在哪里寻找这些文件?这是可配置的还是仅仅是预期的默认值?我在哪里寻找这种配置? 由于我要问这些包含文件的问题,这些文件的来源是什么?我知道在Linux社区中这可能很模糊,但是谁来管理这些?谁将为Windows编译器提供和管理相同的文件。 我总是觉得它们是随编译器一起提供的,但这只是一个假设。
77 linux  gcc  location  include 

4
“ gcc -s”和“ strip”命令有什么区别?
我想知道两者之间有什么区别: gcc -s:从可执行文件中删除所有符号表和重定位信息。 strip:丢弃目标文件中的符号。 它们具有相同的含义吗? 您使用哪一个来: 减少可执行文件的大小? 加快运行速度?
77 gcc  strip  symbols 

9
为什么malloc在gcc中将值初始化为0?
平台之间可能有所不同,但是 当我使用gcc编译并运行下面的代码时,每次在ubuntu 11.10中获得0。 #include <stdio.h> #include <stdlib.h> int main() { double *a = (double*) malloc(sizeof(double)*100) printf("%f", *a); } 为什么即使有calloc,malloc的行为也是如此? 难道就意味着即使您不希望有时将值初始化为0,也会有不必要的性能开销吗? 编辑:哦,我以前的示例不是initiazling,而是碰巧使用“新鲜”块。 我恰好在寻找的是为什么它在分配一个大块时将其初始化: int main() { int *a = (int*) malloc(sizeof(int)*200000); a[10] = 3; printf("%d", *(a+10)); free(a); a = (double*) malloc(sizeof(double)*200000); printf("%d", *(a+10)); } OUTPUT: 3 0 (initialized) 但是感谢您指出在分配时有一个安全原因!(从未考虑过)。确保在分配新鲜块或大块时必须将其初始化为零。
77 c  linux  gcc  malloc 


4
使C浮点字面量浮动(而不是双精度)
众所周知,在C中,浮点文字(例如1.23)具有type double。结果,任何涉及它们的计算都将提高一倍。 我正在一个嵌入式实时系统上工作,该系统的浮点单元仅支持单精度(float)数字。我所有的变量都是float,并且这种精度已经足够。我根本不需要(也负担不起)double。但是每次 if (x < 2.5) ... 写作中,灾难发生了:减速可能高达两个数量级。当然,直接的答案是写 if (x < 2.5f) ... 但这很容易错过(并且很难检测到为时已晚),尤其是当#define由缺乏纪律(或只是新手)的开发人员在单独的文件中输入“配置”值时。 因此,是否有一种方法可以强制编译器将所有(浮点数)文字视为float,就像带有后缀一样f?即使违反规范,我也不在乎。或其他解决方案?顺便说一下,编译器是gcc。

3
CFLAGS,CCFLAGS,CXXFLAGS-这些变量究竟控制什么?
我正在使用GNU make编译我的C ++代码,并且我想了解如何使我的编译可定制。 我看在不同的地方在于CFLAGS,CCFLAGS并且CXXFLAGS被用于此目的。那么我应该如何使用它们呢?如果我对编译器有其他命令行参数,我应该将它们附加到CFLAGS或前面?有没有惯例? 为什么三个不同的变量?我想C编译器应该获取CFLAGS和CCFLAGS,而C ++编译器应该获取CFLAGS和CXXFLAGS-我做对了吗? 人类使用者是否应该设置所有这些变量?做任何自动工具(automake,autoconf等)设置它们?我应该使用的linux系统没有定义任何这些变量-这是典型的吗? 目前,我的Makefile看起来像这样,我感觉有点脏: ifdef code_coverage GCOV_FLAG := -fprofile-arcs -ftest-coverage else GCOV_FLAG := endif WFLAGS := -Wall INC_FLAGS := -Istuff -Imore_stuff -Ietc CCFLAGSINT := -O3 $(WFLAGS) $(INC_FLAGS) $(CCFLAGS) ... (somewhere in the makefile, the command-line for compilation looks like this) $(CC) $(CCFLAGSINT) -c $< -o $@ …


3
如何从GCC / c装配件输出中消除“噪音”?
我想检查boost::variant在我的代码中应用的程序集输出,以查看优化了哪些中间调用。 当我编译以下示例(使用的GCC 5.3 g++ -O3 -std=c++14 -S)时,似乎编译器优化了所有内容并直接返回100: (...) main: .LFB9320: .cfi_startproc movl $100, %eax ret .cfi_endproc (...) #include <boost/variant.hpp> struct Foo { int get() { return 100; } }; struct Bar { int get() { return 999; } }; using Variant = boost::variant<Foo, Bar>; int run(Variant v) { return boost::apply_visitor([](auto& …
76 c++  gcc  assembly  clang 


7
调试选项-g如何更改二进制可执行文件?
编写C / C ++代码时,为了调试二进制可执行文件,必须在编译器/链接器上启用debug选项。对于GCC,该选项为-g。启用调试选项后,对二进制可执行文件有何影响?文件中还存储哪些其他数据,以允许调试器功能正常运行?
75 gcc  gdb  debugging 

3
asm,asm易失性和破坏性内存之间的区别
在实现无锁数据结构和时序代码时,通常有必要抑制编译器的优化。通常情况下,人们会在“障碍物”列表中使用asm volatilewith进行此操作memory,但有时您会看到只是asm volatile或仅有一个简单的asm障碍物记忆。 这些不同的语句对代码生成有什么影响(尤其是在GCC中,因为它不太可能移植)? 仅供参考,以下是一些有趣的变化: asm (""); // presumably this has no effect on code generation asm volatile (""); asm ("" ::: "memory"); asm volatile ("" ::: "memory");
75 c  gcc  inline-assembly 

4
C ++编译错误?
我有以下代码: #include <iostream> #include <complex> using namespace std; int main() { complex<int> delta; complex<int> mc[4] = {0}; for(int di = 0; di < 4; di++, delta = mc[di]) { cout << di << endl; } return 0; } 我希望它输出“ 0、1、2、3”并停止,但输出的序列是“ 0、1、2、3、4、5,..”。 看起来比较di<4效果不佳,并且总是返回true。 如果我只是将其注释掉,delta=mc[di],我会像往常一样得到“ 0,1,2,3”。无辜的任务有什么问题? 我正在使用带有-O2选项的Ideone.com g ++ C ++ 14。

7
是否可以告诉分支预测变量跟随分支的可能性有多大?
为了清楚起见,我在这里不打算进行任何形式的可移植性,因此任何将我与特定机器绑定在一起的解决方案都可以。 基本上,我有一条if语句,它将在99%的时间中将其评估为true,并试图提高性能的最后一个时钟,我是否可以发出某种编译器命令(使用GCC 4.1.2和x86 ISA,如果重要)告诉分支预测器它应该为该分支缓存?


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.