Questions tagged «gcc»

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

7
如何编译由GCC生成的asm?
我在玩一些汇编代码,有些事情困扰着我。 我编译这个: #include <stdio.h> int main(int argc, char** argv){ printf("Hello World\n"); return 0; } 与gcc file.c -S -o file.S此产生一个很好的小片的汇编代码: .cstring LC0: .ascii "Hello World\0" .text .globl _main _main: LFB3: pushq %rbp LCFI0: movq %rsp, %rbp LCFI1: subq $16, %rsp LCFI2: movl %edi, -4(%rbp) movq %rsi, -16(%rbp) leaq LC0(%rip), %rdi call …

3
陷阱表示
C语言中的“陷阱表示”是什么(某些示例可能会有所帮助)?这适用于C ++吗? 给定此代码... float f=3.5; int *pi = (int*)&f; ...和假设sizeof(int) == sizeof(float),做f和*pi有相同的二进制表示/模式?

11
C ++成员函数中的“ if(!this)”有多糟糕?
如果我遇到if (!this) return;了应用程序中的旧代码,这有多严重的风险?它是危险的滴答定时炸弹,需要立即在应用程序范围内进行搜索并破坏工作,还是更像是一种可以悄悄放置的代码气味? 当然,我不打算编写执行此操作的代码。相反,我最近在一个旧的核心库中发现了一些东西,供我们的应用程序的许多部分使用。 想象一个CLookupThingy类具有非虚拟 CThingy *CLookupThingy::Lookup( name )成员函数。显然,在那个牛仔时代,一位程序员遇到过多次崩溃,这些崩溃CLookupThingy *是从函数传递NULL的,而不是修复数百个调用站点,而是安静地修复了Lookup(): CThingy *CLookupThingy::Lookup( name ) { if (!this) { return NULL; } // else do the lookup code... } // now the above can be used like CLookupThingy *GetLookup() { if (notReady()) return NULL; // else etc... } CThingy *pFoo = …
74 c++  visual-c++  gcc 

6
创建持有已分配数组的unique_ptr的正确方法
创建一个unique_ptr来保存在免费存储中分配的数组的正确方法是什么?Visual Studio 2013默认情况下支持此功能,但是当我在Ubuntu上使用gcc版本4.8.1时,会出现内存泄漏和未定义的行为。 可以使用以下代码重现该问题: #include <memory> #include <string.h> using namespace std; int main() { unique_ptr<unsigned char> testData(new unsigned char[16000]()); memset(testData.get(),0x12,0); return 0; } Valgrind将给出以下输出: ==3894== 1 errors in context 1 of 1: ==3894== Mismatched free() / delete / delete [] ==3894== at 0x4C2BADC: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==3894== by 0x400AEF: …
74 c++  linux  gcc  c++11  unique-ptr 

3
为什么gcc中'-l'选项的顺序很重要?[重复]
这个问题已经在这里有了答案: 为什么链接库的顺序有时会导致GCC错误? (9个答案) 上个月关闭。 我正在尝试编译一个使用udis86库的程序。实际上,我正在使用库用户手册中给出的示例程序。但是在编译时会产生错误。我得到的错误是: example.c:(.text+0x7): undefined reference to 'ud_init' example.c:(.text+0x7): undefined reference to 'ud_set_input_file' . . example.c:(.text+0x7): undefined reference to 'ud_insn_asm' 我正在使用的命令是: $ gcc -ludis86 example.c -o example 按照用户手册中的指示。 显然,链接器无法链接libudis库。但是,如果我将命令更改为: $ gcc example.c -ludis86 -o example 它开始工作。因此,请有人解释第一个命令的问题是什么?
72 c  gcc  linker  ld 

5
是否允许编译器优化堆内存的分配?
考虑使用以下简单代码new(我知道没有delete[],但是与这个问题无关): int main() { int* mem = new int[100]; return 0; } 是否允许编译器优化new调用? 在我的研究中,g ++(5.2.0)和Visual Studio 2015不能优化new调用,而clang(3.0+)可以优化调用。所有测试均已启用了全部优化功能(对于g ++和clang为-O3,对于Visual Studio为Release模式)。 是不是 new幕后进行系统调用,从而使编译器无法(而且是非法的)优化它吗? 编辑:我现在已经从程序中排除了未定义的行为: #include <new> int main() { int* mem = new (std::nothrow) int[100]; return 0; } clang 3.0不再优化了,但是更高版本。 编辑2: #include <new> int main() { int* mem = new (std::nothrow) int[1000]; …

9
如何防止GCC优化繁忙的等待循环?
我想为Atmel AVR微控制器编写C代码固件。我将使用GCC进行编译。另外,我想启用编译器优化(-Os或-O2),因为我没有理由不启用它们,并且它们可能比手动编写程序集更快地产生更好的组装方式。 但是我想要一小段未优化的代码。我想将函数的执行延迟一段时间,因此我想编写一个空循环,以浪费时间。无需精确,只需等待一段时间。 /* How to NOT optimize this, while optimizing other code? */ unsigned char i, j; j = 0; while(--j) { i = 0; while(--i); } 由于AVR内存访问是慢了很多,我想i和j被关在CPU寄存器。 更新:我刚刚从AVR Libc中找到util / delay.h和util / delay_basic.h。尽管大多数时候使用这些功能可能是一个更好的主意,但这个问题仍然有效且有趣。 相关问题: 如何防止gcc在C语言中优化某些语句? 有没有办法告诉GCC不要优化特定代码? 如何不优化-愚蠢功能的机制
72 c  optimization  gcc  avr-gcc 

3
添加字符时,编译器停止优化未使用的字符串
我很好奇为什么下面的代码: #include <string> int main() { std::string a = "ABCDEFGHIJKLMNO"; } 当使用编译时,将-O3产生以下代码: main: # @main xor eax, eax ret (我完全理解不需要多余的,a因此编译器可以从生成的代码中完全忽略它) 但是以下程序: #include <string> int main() { std::string a = "ABCDEFGHIJKLMNOP"; // <-- !!! One Extra P } 产量: main: # @main push rbx sub rsp, 48 lea rbx, [rsp + …

5
构建GCC需要GMP 4.2 +,MP​​FR 2.3.1+和MPC 0.8.0+
我从http://www.netgull.com/gcc/releases/gcc-4.5.0/下载了GCC 4.5,但是当我尝试设置/构建时,出现以下错误: Linux:>~/shared_scripts/bin/gcc/gcc-4.5.0 1040> /x/home/prakash_satya/shared_scripts/bin/gcc/gcc-4.5.0/configure CC="gcc -m64" --prefix=/x/home/prakash_satya/shared_scripts/bin/gcc/gcc-4.5.0 --with-gmp-lib=/usr/lib64 --with-mpfr-lib=/usr/lib64 --enable-shared --enable-threads=posix --enable-__cxa_atexit --enable-clocale=gnu --enable-languages=c,c++ checking build system type... x86_64-unknown-linux-gnu checking host system type... x86_64-unknown-linux-gnu checking target system type... x86_64-unknown-linux-gnu checking for a BSD-compatible install... /usr/bin/install -c checking whether ln works... yes checking whether ln -s works... yes checking for …
72 gcc  gmp  mpfr  mpc 

2
什么是扩展名为.a的文件?
我下载了这个:https : //github.com/mongodb/mongo-c-driver 现在,我试图在我的C程序中使用它,但是我不知道如何处理生成的.a文件。这些是什么?我找不到任何信息,甚至在GCC手册中也找不到。 我这样构建它: scons --c99 另外,我可以在C89程序中使用C99库吗?

2
'int main(){return(0);上的浮点异常(SIGFPE);}'
我正在尝试为两个不同的Linux环境构建一个简单的C程序。在一个设备上,程序运行正常,在另一设备上,程序生成浮点异常。该程序除了从main返回0之外什么都不做,这使我相信与启动代码也许不兼容,也许是ABI? 该程序使用gcc编译,具有以下构建规范: 使用内置规格。目标:i386-redhat-linux配置为:../configure --prefix = / usr --mandir = / usr / share / man --infodir = / usr / share / info --enable-shared --enable-threads = posix --enable-checking = release --with-system-zlib --enable -__ cxa_atexit --disable-libunwind-exceptions --enable-libgcj-multifile --enable-languages = c,c ++,objc,obj-c ++ ,java,fortran,ada --enable-java-awt = gtk --disable-dssi --disable-plugin --with-java-home = / …
71 c  linux  gcc  elf  sigfpe 

3
用g ++编译的奇怪代码
以下代码使用g ++ 4.8.1成功编译: int main() { int(*)(); } 它看起来像一个简单的函数指针声明: int(*f)(); 它不能与clang 3.4和vc ++ 2013一起编译。 是编译器错误还是标准的暗处之一? 使用g ++ 4.8.1可以正常编译的类似奇怪代码片段的列表(已更新): int(*)(); int(*); int(*){}; int(*()); 这些奇怪代码片段的现场示例。 更新1: @Ali在注释中添加了一些有趣的信息: 所有4种情况均使用clang 3.5干线(202594)给出了编译错误,并且使用gcc 4.9干线(20140302)进行了编译。的行为与相同-std=c++98 -pedantic,但int(*){};可以理解的除外。扩展的初始化程序列表仅适用于-std=c++11。 更新2:正如@CantChooseUsernames在他的回答中指出的那样,即使没有初始化,它们仍然可以正常编译,即使没有启用任何优化,g ++也不会为它们生成任何汇编(既没有初始化也没有初始化): int(*)() = 0; int(*) = 0; int(*){} = 0; int(*()) = 0; 带有初始化的实时示例。 更新3:令我惊讶的是int(*)() = "Hello, world!";,它也int(*p)() = "Hello, …
71 c++  gcc  c++11  g++ 

7
什么是“非法指令:4”错误?为什么“ -mmacosx-version-min = 10.x”可以解决该错误?
Illegal Instruction: 4当这些二进制文件在Mac OS X 10.7.x(“ Lion”)和早期版本下运行时,我在Mac OS X 10.8.2(“ Mountain Lion”)下使用GCC 4.7.2编译的二进制文件出现错误。这些二进制文件在Mac OS X 10.8.x下可以正常工作。 我添加-mmacosx-version-min=10.5了我的编译标志,无论该问题是什么,这似乎都有助于解决10.5.x,10.6.x和10.7.x客户端的问题。 哪个引起了我的问题: 有什么Illegal Instruction: 4错误? 为什么要-mmacosx-version-min=10.x在10.x更大的客户群上解决此特定错误? 我想将此修复程序应用于我的makefile,但想知道在执行触发器之前它在做什么。(我会拥有更大的二进制文件吗?我还会有64位二进制文​​件吗?我应该了解这种方法的陷阱吗?意外的副作用?等等。)

3
GCC 4.8中C ++ 11 thread_local变量的性能损失是多少?
从GCC 4.8变更日志草案中: G ++现在实现了C ++ 11 thread_local关键字;这与GNU__thread关键字的主要区别在于它允许动态初始化和销毁​​语义。不幸的是,此支持要求引用非函数局部thread_local变量,即使它们不需要动态初始化也需要运行时惩罚 ,因此用户可能希望继续使用__thread具有静态初始化语义的TLS变量。 这种运行时惩罚的本质和来源到底是什么? 显然,要支持非函数局部thread_local变量,在进入每个线程主线程之前都需要一个线程初始化阶段(就像全局变量有一个静态初始化阶段一样),但是它们是否指的是超出此范围的运行时代价? ? 粗略地说,gcc的thread_local新实现的体系结构是什么?

5
如何通过修改命令行中给出的路径名来停止MinGW和MSYS
在Windows上,我正在使用CodeSourcery的交叉编译器套件为ARM / Linux交叉编译程序。我使用MinGW MSYS作为我的命令解释器,通常它会破坏我的路径和路径名。例如,要构建程序,我调用 arm-none-linux-gnueabi-gcc.exe -Wall -g \ -Wl,--dynamic-linker=/usr/lib/myrpath/ld-linux.so.3 \ -Wl,-rpath=/usr/lib/myrpath \ -I../targetsysroot/usr/include \ myprogram.c -o myprogram 当然,我想/usr/lib/myrpath将逐字记录插入myprogram可执行文件中-我要编译的ARM Linux目标不使用MinGW或MSYS。但是,最终结果如下: ... 0x0000000f (RPATH) Library rpath: [C:/MinGW/msys/1.0/lib/myrpath] ... 不完全是我想要的。如果直接在cmd.exe命令行上调用GCC,则会在可执行文件中获得正确的rpath。如果我在MSYS命令行上调用GCC,则会得到混乱的rpath。如果我使用从cmd.exe命令行使用make运行的Makefile调用GCC,我仍然会得到错误的rpath(!) 有什么想法可以关闭这种令人讨厌的行为吗?

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.