Tag: gcc

GCC选项强制执行A​​nsi C标准检查?

我应该使用哪些gcc选项来强制执行A​​NSI C(C99)警告/错误? gcc(GCC)3.4.2(mingw-special) 我正在使用:gcc -pedantic -ansi -std = c99这是正确的吗?

GCC:__ attribute __((malloc))

引用海湾合作委员会文件 (强调我的): malloc属性用于告诉编译器可以将函数视为其返回的任何非NULL指针在函数返回时不能将任何其他指针作为别名,并且内存具有未定义的内容 。 这通常会改善优化。 具有此属性的标准函数包括malloc和calloc 。 类似realloc的函数没有此属性,因为指向的内存没有未定义的内容。 我有以下代码: struct buffer { size_t alloc; // Allocated memory in bytes size_t size; // Actual data size in bytes char data[]; // Flexible array member }; #define ARRAY_SIZE buffer *buffer_new(void) __attribute__((malloc)) { struct buffer *ret; ret = malloc(sizeof(struct buffer) + ARRAY_SIZE); if (!ret) fatal(E_OUT_OF_MEMORY); ret->alloc = ARRAY_SIZE; […]

如何强制OpenMPI使用GCC而不是ICC? 是否需要重新编译OpenMPI?

我有一个为gcc编写的并行计算的C代码,我想在一个集群上编译它,显然它通过mpicc使用icc 。 将代码更改为icc友好似乎对时间要求太高,所以我想知道我是否可以要求OpenMPI使用gcc代替。 我没有该群集的管理员权限,我实际上更愿意不弄乱原始配置。 如果无法在例如Makefile设置,那么我希望在我的主目录中编译OpenMPI ,但是我需要一些指导,然后必须做什么。 你可以帮帮我吗? UPDATE1 Makefile包含 CC = mpicc CFLAGS += -DMPI 这里有一些OpenMPI文件 $ which mpicc /usr/bin/mpicc lrwxr-xr-x /usr/bin/mpicc -> opal_wrapper -rwxr-xr-x /usr/bin/opal_wrapper 如果我能为您提供更多信息,请告诉我。 UPDATE2 在Jeff的帮助下 ,我能够找到mpicc OpenMPI设置 $ more /usr/local/share/openmpi/mpicc-wrapper-data.txt project=Open MPI project_short=OMPI version=1.1.4 language=C compiler_env=CC compiler_flags_env=CFLAGS compiler=icc extra_includes= openmpi preprocessor_flags= compiler_flags=-pthread linker_flags= libs=-lmpi -lorte -lopal -ldl -Wl,–export-dynamic -lnsl -lutil -ldl […]

关于GCC和交叉编译的一般问题

最近我一直在使用GCC进行交叉编译,并发现了一个看似复杂的区域,即工具链。 我不太明白这一点,因为我认为GCC可以为大多数常见架构创建二进制机器代码,而其他真正重要的是你链接的库和创建的可执行类型。 GCC不能自己做所有这些事吗? 通过单一构建的GCC,所有适当的库和发送到GCC的正确标志,我可以为Windows x86机器生成PE可执行文件,然后为嵌入式Linux MIPS设备创建ELF可执行文件,最后为OSX PowerPC创建可执行文件机? 如果没有,有人可以解释你将如何实现这一目标?

x86_64:堆栈帧指针几乎没用?

Linux x86_64。 gcc 5.x 我正在研究两个代码的输出,使用-fomit-frame-pointer和without(gcc at“-O3”默认启用该选项)。 pushq %rbp movq %rsp, %rbp … popq %rbp 我的问题是: 如果我全局禁用该选项,即使是在极端情况下编译操作系统,是否有一个问题? 我知道中断使用该信息,那么该选项仅适用于用户空间吗?

如何在MSVC中获取指向二进制部分的指针?

我正在编写一些代码,它将一些数据结构存储在一个特殊的命名二进制部分中。 这些是同一结构的所有实例,它们分散在许多C文件中,并且不在彼此的范围内。 通过将它们全部放在命名区域中,我可以遍历所有这些区域。 在GCC中,我使用_ attribute _((section(…))加上一些特别命名的extern指针,这些指针由链接器神奇地填充。这是一个简单的例子: #include extern int __start___mysection[]; extern int __stop___mysection[]; static int x __attribute__((section(“__mysection”))) = 4; static int y __attribute__((section(“__mysection”))) = 10; static int z __attribute__((section(“__mysection”))) = 22; #define SECTION_SIZE(sect) \ ((size_t)((__stop_##sect – __start_##sect))) int main(void) { size_t sz = SECTION_SIZE(__mysection); int i; printf(“Section size is %u\n”, sz); for (i=0; i < […]

如何使用GCC对齐C for-loop体?

在我们的嵌入式架构中,我们有一个64位IAB(指令对齐缓冲器)。 为了优化获取序列,需要循环体开始与8字节边界对齐。 使用.balign指令很容易在汇编中实现这一点,但我找不到一个会暗示C编译器对齐代码的语法。 尝试在带有.balign指令的内联汇编的for循环之前不起作用,因为它对齐for循环prolog(设置)而不是循环体本身。 在asm()行位于循环内部的情况下,将nop -s添加到循环体中,这需要花费宝贵的周期。 编辑1:假设代码: __asm__ volatile(“nop”); __asm__ volatile(“nop”); for (j0=0; j0<N; j0+=4) { c[j0+ 0] = a[j0+ 0] + b[j0+ 0]; c[j0+ 1] = a[j0+ 1] + b[j0+ 1]; c[j0+ 2] = a[j0+ 2] + b[j0+ 2]; c[j0+ 3] = a[j0+ 3] + b[j0+ 3]; } 我希望第一个c=a+b与8字节地址对齐。 我可以在初步编译后添加类似上面的nop -s,但这是一个特殊的解决方案,它会破坏第一个代码更改。 编辑2:感谢@R ..,解决方案是使用-falign-loops=8编译器选项。

在OS X Mavericks中从C ++链接C语言

转换到OS X Mavericks和XCode 5.0.1后,我再也不能优雅地将已编译的C文件(从gcc输出)链接到C ++项目(从g ++输出)。 从我的makefile生成的令人讨厌的命令对是: gcc `pkg-config –cflags glib-2.0` -g -Wall -O3 `pkg-config –cflags flann` -c -o vec.o vec.c g++ `pkg-config –cflags glib-2.0` -g -Wall -O3 -stdlib=libstdc++ -lstdc++ layoutquality.cpp vec.o `pkg-config –libs glib-2.0` -L/usr/local/Cellar/flann/1.8.4/lib -lflann -o layoutquality 链接器抱怨的是: 体系结构x86_64的未定义符号:“load_dmat(char const *)”,引用自:layoutquality中的_main-I8HOqy.o ld:未找到体系结构x86_64的符号 其中load_dmat只是文件vec.c中的一个函数。 如果我在第一行用g++替换gcc ,那么一切都编译好并且链接很好,但clang说: clang:警告:在C ++模式下将’c’输入视为’c ++’时,不推荐使用此行为 是否有一种无害的,不推荐的编译和链接方式? 在升级到OS X Mavericks和新命令行工具之前,将g++与gcc目标文件链接在一起工作正常。 任何有关变化和如何前进的见解都会很棒,谢谢。

为什么我可以在gcc -std = c11中使用gets()?

gets()函数已从C语言中删除。 标准中不存在此类function。 然而,我编译以下代码: #include int main (void) { (void) gets (NULL); } 运用 gcc -std=c11 -pedantic-errors -Wall -Wextra 它编译时不会出现任何错误或警告。 同样的, #include int gets; int main (void) {} 不会编译(错误:’获得’重新声明为不同类型的符号)。 在标准4.一致性§6中,我们可以阅读: 符合条件的实现可能具有扩展(包括附加库函数),前提是它们不会改变任何严格符合程序的行为 鉴于上述情况,我认为即使在迂腐模式下,gcc也不符合标准。 是否有一个原因? 这是故意还是错误? GCC版本4.9.1。 编辑: gcc –version gcc (x86_64-win32-seh-rev1, Built by MinGW-W64 project) 4.9.1

如何使用GDB从多个文件中找到分段错误

我在面试中被问到如何使用GDB在C程序中调试分段错误 。 我告诉他们我们可以使用-g选项编译我们的程序,因为它可以将调试信息添加到二进制文件中并且可以读取核心转储文件但是然后面试官告诉我他们是否有3到4个文件一起编译但是其中一个导致了分段错误然后我们如何在GDB中调试?