Tag: gcc

C和C ++中的全局变量有什么区别?

我测试了以下代码: 在文件ac / a.cpp中 int a; 在文件bc / b.cpp中 int a; int main() { return 0; } 当我使用gcc * .c -o test编译源文件时,它会成功。 但是当我使用g ++ * .c -o test编译源文件时,它会失败: ccIJdJPe.o:b.cpp:(.bss+0x0): multiple definition of ‘a’ ccOSsV4n.o:a.cpp:(.bss+0x0): first defined here collect2.exe: error: ld returned 1 exit status 我真的很困惑。 C和C ++中的全局变量之间有什么区别吗?

如何禁用gcc警告“cc1:warning:命令行选项’-std = c ++ 11’对C ++ / ObjC ++有效,但对C无效”

我是cmake和gcc的新手。 我在公司的新角色中的第一个任务是清除我的linux编译中的大部分错误,现在我看到的唯一警告是 cc1: warning: command line option ‘-std=c++11’ is valid for C++/ObjC++ but not for C [enabled by default] 我希望枯萎抑制警告或解决cmake文件中的问题。 不幸的是,我仍然没有找到适合这里的正确-Wno-xxx语句。 谢谢!

如何使用GCC将源代码行与汇编输出内联?

我想让C源代码行与汇编输出内联,以查看正在生成的代码。 我尝试过像-S -Wa,-ahlms这样的GCC选项(甚至-Wa,–gstabs因为我在某处读过它)。 哦! 顺便说一句,我在Mac上,所以我没有objdump 。 (对不起,这很简短,我必须下车!) 输出gcc pc-clisp.c -S -g -fverbose-asm -fnested-functions .globl _getBool _getBool: LFB32: LM21: pushl %ebp # LCFI30: movl %esp, %ebp #, LCFI31: subl $8, %esp #, LCFI32: LM22: movzbl 8(%ebp), %eax # atom.pred, D.4112 movzbl %al, %eax # D.4112, D.4113 andl $-16, %eax #, D.4114 sarl $4, %eax #, D.4115 […]

未定义的_sbrk引用

我遇到了_sbrk的问题。 在编译的链接阶段,我使用下面的命令链接我的对象,我得到未定义的引用_sbrk。 arm-none-eabi-ld -static -T linkerscript.ld -o exe timer_example.o /home/ziga/projects/cs_lite/arm-none-eabi/lib/libc.a /home/ziga/projects/cs_lite/lib/gcc/arm-none-eabi/4.5.1/libgcc.a 我正在编译arm926ej-s并在ARM模式下,所以我想我选择了正确的multilib(libc.a和libgcc.a),它位于文件夹home / ziga / projects / cs_lite / arm-none-eabi / lib / 。 我一直在网上搜索_sbrk函数,它是某种内存管理调用,它不包含在标准C库中,因为它依赖于微处理器。 所以我必须自己编写_sbrk函数吗? 我该怎么做? 你有arm926ej-s的例子吗? 编写此函数后,我打算将其编译为目标文件,并将其与其他对象库连接在一起。 亲切的问候,Ziga。 我解决了这个问题并将在这里发布解决方案,所以我回馈社区。 函数_sbrk位于ARM的NXP CDL包中。 包可供下载(链接适用于所有不熟悉此function的人): http ://www.lpclinux.com/Downloads/WebHome在子文件夹CDL_v005 / csps / lpc313x / bsps / ea3131 / source中,您将找到命名的源文件libnosys_gnu.c应该添加到项目中并编译到目标文件,之后链接到可执行文件以及其他对象和库。 祝愿和成功。

带参数“-S -save-temps”的gcc将中间文件放在当前目录中

参数-S -save-temps工作正常,只要我不在具有相同名称的文件上使用它们。 考虑以下情况:我有一个带有主目录的项目和一个名为subDir的子目录,在这两个目录中都放置了名为subDir文件。 如果我现在调用gcc -S -save-temps file.cpp subDir/file.c将只生成一个名为file.i中间文件。 这是预期的行为,正如gcc的man文件告诉我的那样,当使用-save-temps时,中间文件将始终放在当前路径中。 我的问题是,我正在研究我事先不知道的项目。 很有可能,有人在他的Makefiles中构建了上面提到的例子。 在那种情况下,我会被卡住,因为我需要两个中间文件。 对我正在构建的系统说几句话(为了更好地理解):我的工具使用make –just-print来收集调用,一个项目的make文件调用。 我扫描这些调用以进行编译器调用并添加-save-temps和-S选项。 目的是获取在编译项目过程中使用的每个预处理文件。 你是否有任何想法,即使上面提到的例子应该出现,我怎么能得到每个预处理的文件?

在C / C ++中直接写入内存地址的最短代码是什么?

我正在为没有内存保护的嵌入式系统编写系统级代码(在ARM Cortex-M1上,使用gcc 4.3编译),需要直接读/写内存映射寄存器。 到目前为止,我的代码看起来像这样: #define UART0 0x4000C000 #define UART0CTL (UART0 + 0x30) volatile unsigned int *p; p = UART0CTL; *p &= ~1; 有没有使用指针的更短路(代码更短,我的意思)? 我正在寻找一种方法来编写实际的赋值代码(如果我不得不使用更多的#defines,那就没关系): *(UART0CTL) &= ~1; 到目前为止我尝试过的任何东西最终都是因为gcc抱怨它无法为左值分配东西……

理解strlen实现中的代码

关于glibc中string.h中strlen的实现,我有两个问题。 该实现使用带有’holes’的幻数。 我无法理解这是如何工作的。 有人可以帮我理解这个片段: size_t strlen (const char *str) { const char *char_ptr; const unsigned long int *longword_ptr; unsigned long int longword, himagic, lomagic; /* Handle the first few characters by reading one character at a time. Do this until CHAR_PTR is aligned on a longword boundary. */ for (char_ptr = str; ((unsigned long int) […]

为GCC运行“轻型”预处理器

有没有办法运行GCC预处理器,但仅适用于用户定义的宏? 我有一些单行和一些#ifdef等条件,我想看看我的代码在扩展时的样子。 实际上,包括扩展,我的fprintf(stderr)变成fprintf(((__getreeent())->_stderr)等。

为什么在使用gcc和std = c99进行编译时找不到getaddrinfo

我有以下代码,我试图编译。 当我尝试使用std = c99时,它失败并发出有关“类型struct addrinfo的隐式声明”和“函数getaddrinfo的隐式声明”的警告。 它适用于std = gnu99。 #include #include #include int fails(const char *host, const char *port, struct addrinfo *hints) { int rc; struct addrinfo *results; // can’t find this function?? rc = getaddrinfo(host, port, hints, &results); // free memory in this important application freeaddrinfo(results); return rc; } 我用来编译的命令是: gcc -c -o fail.o -Wall […]

什么是gcc中的-ffreestanding选项?

什么是gcc中的ffreestanding ? 它是干什么用的 ? 我遇到了以下情况: gcc -ffreestanding -m32 -c kernel.c -o kernel.o 并且不明白,它究竟意味着什么。