Articles of gcc

简单的C代码可以在HPUX上正常工作,但是Linux上的段错误。 为什么?

我很长时间没有做过任何严肃的C,希望能够快速解释一下。 以下代码在HP / UX上编译并运行良好。 它在GCC 4.3.2上编译没有任何警告(甚至是在gcc-Wall中),但在Linux上运行时却是segfaults。 谁能解释为什么? #include <stdio.h> int main() { char *people[] = { "Abigail", "Bob" }; printf("First: '%s'\n", people[0]); printf("Second: '%s'\n", people[1]); /* this segfaults on Linux but works OK on HP/UX */ people[1][0] = 'R'; printf("First: '%s'\n",people[0]); return(0); }

旧的ARM32二进制文件可以在AARCH64内核上运行吗?

我很好奇在AARCH64-Linux机器上运行旧的ARM32-Linux程序的可行性,我进行了一些实验: 写一个程序“Hello,World!” 并用arm-none-linux-gnueabi-gcc和aarch64-linux-gnu-gcc静态编译。 静态构build并使用busybox和aarch64编译器创build一个虚拟硬盘。 把2“你好,世界!” 程序(在ARM32和AARCH64中)到ramdisk。 用vexpress_defconfig和aarch64编译器构build一个简单的AARCH64-Linux内核。 使用qemu-system-aarch64运行内核和ramdisk。 (包括ramdisk中的busybox在内的所有二进制文件都是静态编译的。) 结果: “你好,世界!” 程序在AARCH64被成功执行。 “你好,世界!” 程序在ARM32不能运行,但显示消息: 第1行:语法错误:意外的词(期待“)”) 有解决上述问题的build议或专业知识吗?

如何解决在Linux 32位机上的REG_EIP未声明(首次在此函数中使用)错误?

我在用C语言编写的用gcc编写的信号处理器程序时遇到了错误,在发生分段错误后显示转储的寄存器值。 当我尝试使用代码访问它时: void print_registers(FILE *fd, ucontext_t *ctx, bool fpu = false) { const char *flags_str[] = { "CF", 0, "PF", 0, "AF", 0, "ZF", "SF", "TP", "IF", "DF", "OF", 0, 0, "NT", 0, "RF", "VM", "AC", "VIF", "VIP", "ID" }; greg_t *regs = ctx->uc_mcontext.gregs; void *eip[1] = { (void*)regs[REG_EIP] }; char **symbol = backtrace_symbols(eip, 1); […]

无法运行编译的文件 – bash:./a.out:权限被拒绝。 (我试过chmod)

我使用cc test.c编译了我的C源代码,并生成了a.out文件。 但是,当我运行它,我得到这个错误 – bash: ./a.out: Permission denied 我的源不在主目录中,它位于不同的FAT-32分区上,所以我使用以下命令安装了代码所在的驱动器 – $ udisks –mount /dev/sda7 –mount-options umask=022 Mounted /org/freedesktop/UDisks/devices/sda7 at /media/48E9-FD53 $ cd /media/48E9-FD53/C 然后我使用cc编译我的代码 我也试过gcc 。 但是我仍然得到相同的错误。 然后我做了 – chmod +x a.out ,仍然是同样的问题。 还有( chmod 755 a.out )和chmod u+x a.out 。 我也试着用sudo编译和执行程序。 我也试过 – sudo chown sannidhya:sannidhya a.out 。 我尝试了Googlesearch后发现的所有内容,但仍无法使其正常工作。 我如何运行.out文件(不移动到主目录)? 注 – 我正在使用Ubuntu 12.04 […]

为什么我得到这个错误? void *不是指向对象types的指针。

void *stackAddr[NUM_THREADS]; stackAddr[i] = malloc(STACKSIZE); 编译器(g ++ 4.4.3)抱怨malloc被调用的地方… warning: pointer of type 'void *' used in arithmetic error: 'void*' is not a pointer-to-object type 如果你有兴趣看到整个代码,在这里它… #include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <math.h> #define NUM_THREADS 4 void *stackAddr[NUM_THREADS]; pthread_t thread[NUM_THREADS]; pthread_attr_t attr; void *BusyWork(void *t) { int i; long tid; double result=0.0; tid = (long)t; […]

为共享库文件(* .so)生成头文件(* .h)

我有共享库文件( libmylib.so ),但没有头文件( mylib.h )。 你知道一些方法/工具从共享库文件生成这个头文件吗?

在C预处理器中避免双重macros观replace

这是一个简单的小C程序,让我困惑了一会儿: #include <stdio.h> #define STR1(x) #x #define STR(x) STR1(x) int main(void) { printf("%s\n", STR(MYDEF)); } 这只是使用标准的string化双定义技术将stringMYDEF #define的值打印出来。 使用gcc -DMYDEF=abc prog.c编译(在Linux上)运行结果,并不奇怪,它打印出'abc'。 但是改变gcc -DMYDEF=linux prog.c的值,打印的结果不是'linux',而是'1'。 所以这让我困惑了一下,但是当然是因为gcc(在Linux上)发现了一个名为'linux'的内置的#define,其值为'1',而STR(x)macros最后将MYDEF扩展为“linux”,然后将linux扩展为“1”。 在我真正的程序中(这比上面的小testing要复杂得多),我用一种不同的(可能更好的)方式来处理这个事情,但是这让我好奇……是否有一个简单的小macros技术可以避免这个双重replace,并使程序打印出'linux'? 我知道我可以添加一个-U或#undef的Linux,但是这感觉有点笨拙。 我以为所有内置的#define都以下划线(通常是双下划线)开头,但我猜不是。

如何在Linux中使用gcc的旧版本

在Linux中,我试图编译使用-fwritable-strings选项的东西。 显然这是一个gcc选项,在新版本的gcc中不起作用。 我在我的系统上安装了gcc-3.4,但我认为新版本仍然在使用,因为我仍然得到错误,说它无法识别命令行选项-fwritable-strings。 我怎样才能使用旧版本的gcc?

g ++ 4.1.2没有在此范围内声明runtime_error

相同的代码在gcc 4.5.2上正常工作,但是当试图在gcc 4.1.2上编译时,我得到错误'runtime_error' was not declared in this scope 。 我有 #include <stdexcept> 这是gcc 4.1.2的问题吗? 代码摘录 // Constructor if (resource cannot be acquired) throw std::runtime_error("Blah Blah");

GCC是否支持命令文件

MSVC编译器支持用于传递命令行选项的命令文件 。 这主要是由于可以传递给CreateProcess调用的命令行参数的大小的限制。 这在Linux系统上不是什么问题,但是在执行Unix应用程序(如gcc)的cygwin端口时,应用相同的限制。 因此,有没有人知道如果gcc / g ++也支持某种types的命令文件? 谢谢。