Articles of gcc

为共享库文件(* .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的命令文件? 谢谢。

传统的gcc编译器问题

我们正在使用一个基于gcc 2.6.0的遗留编译器来交叉编译我们现在仍在使用的旧embedded式处理器(是的,它自1994年起仍在使用!)。 为这个芯片做了gcc端口的工程师早就开始工作了。 尽pipe我们可以从网上的某个地方恢复gcc 2.6.0源码,但是这个芯片的设置已经在公司历史的大厅里消失了。 直到最近,由于编译器仍在运行并生成可用的可执行文件,所以直到最近,我们一直在困惑,但是从2.6.25内核(也是2.6.26)开始,它会失败并显示消息gcc: virtual memory exhausted …即使不带参数运行或只有-v 。 我已经使用2.6.24内核重启了我的开发系统(从2.6.26开始),编译器再次运行(2.6.25不重启)。 我们有一个系统,我们在2.6.24中只是为了构build这个芯片而做的,但是当linux世界移动到我们不能再重build一个将运行的系统编译器(即我们的2.6.24系统死机,我们不能得到2.6.24安装和运行在一个新的系统,因为一些软件部分不再可用)。 有没有人有任何想法,我们可以做一个更现代化的安装,让这个遗留的编译器运行? 编辑 : 回答一些评论… 不幸的是,这是我们的芯片特有的源代码更改丢失。 这个损失发生在两个主要的公司reorgs和几个系统pipe理员(其中几个真的留下了一个烂摊子)。 我们现在使用configuration控制,但是对于这个问题,closures仓库门太晚了。 虚拟机的使用是一个好主意,也可能是我们最终做的事情。 谢谢你的想法。 最后,我试着用ephemientbuild议strace,发现最后一个系统调用是brk(),它在新系统(2.6.26内核)上返回一个错误,并在旧系统(2.6.24内核)上返回成功。 这表明我真的用完了虚拟内存,除了tcsh“limit”在旧系统和新系统上返回相同的值,而/ proc / meminfo显示新系统的内存稍微多一些,交换空间也多了一点。 也许这是一个碎片问题或程序正在加载? 我做了一些进一步的研究,并在内核2.6.25中添加了“brk随机化”,但CONFIG_COMPAT_BRK默认启用(禁用brk随机化)。 编辑 : OK,更多信息:看起来像brk随机化是罪魁祸首,遗留gcc调用brk()来更改数据段的结尾,现在失败,导致遗留gcc报告“虚拟内存已耗尽”。 有几个logging的方法来禁用brk随机化: sudo echo 0 > /proc/sys/kernel/randomize_va_space sudo sysctl -w kernel.randomize_va_space=0 用setarch i386 -R tcsh (或“-R -L”)启动一个新的shell 我已经尝试过,他们似乎有一个效果,brk()返回值是不同的(总是相同的)比没有他们(在内核2.6.25和2.6.26尝试),但brk()仍然失败,所以传统的gcc仍然失败:-(。 另外,我已经设置vm.legacy_va_layout=1和vm.overcommit_memory=2没有任何变化,我已经用/etc/sysctl.conf中保存的vm.legacy_va_layout=1和kernel.randomize_va_space=0设置重新启动。 仍然没有改变。 编辑 : 在内核2.6.26(和2.6.25)上使用kernel.randomize_va_space=0导致strace legacy-gcc报告的以下brk()调用: […]

安装旧版本的gcc

我想在我的Ubuntu 64位系统上安装gcc 4.1.2,目前这个系统有gcc 4.4。 我想继续使用当前的gcc,但也想添加gcc 4.1.2。 任何简单的方法来做到这一点,即在我的系统上安装gcc 4.1.2?

Linux上的_emit相当于什么?

我试图将在Visual Studio中编写的汇编代码移植到Linux上的GNU内联汇编中。 原始代码使用MSDN描述的_emit作为伪指令,并解释为: _emit伪指令类似于MASM的DB指令。 您可以使用_emit在当前文本段中的当前位置定义一个即时字节。 但是,_emit一次只能定义一个字节,只能在文本段中定义字节。 它使用与INT指令相同的语法。 我怎样才能在Linux上做同样的事情?

在共享库的构build选项中添加“-rpath,/ usr / lib”会导致段错误

我有一个你好世界计划。 #include <stdio.h> #include <stdlib.h> int main() { printf("hello world! \n"); return 0; } 我在链接阶段的程序-lmicroxml中添加-lmicroxml以链接到库libmicroxml.so 当我启动我的程序时,我得到了一个分段错误。 分段故障与libmicroxml.so的加载有关。 在我的helleo世界计划执行的strace之后: strace ./test execve("./test", ["./test"], [/* 11 vars */]) = 0 old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|0x4000000, -1, 0) = 0x777de000 stat("/etc/ld.so.cache", 0x7f944760) = -1 ENOENT (No such file or directory) open("/lib/libmicroxml.so.1", O_RDONLY) = -1 ENOENT (No such file or […]

无法执行'x86_64-conda_cos6-linux-gnu-gcc':没有这样的文件或目录(pysam安装)

我正在尝试安装pysam。 执行完毕后: python path/to/pysam-master/setup.py build 产生这个错误: unable to execute 'x86_64-conda_cos6-linux-gnu-gcc': No such file or directory error: command 'x86_64-conda_cos6-linux-gnu-gcc' failed with exit status 1 有类似的线程,但他们似乎都解决了问题assumigpipe理员权利,我没有。 有没有办法来安装所需的文件? 免责声明:这个问题来自我以前的职位。 手动安装pysam错误:“ImportError:No module named version”但是由于它可能需要不同的方法,所以我提出了一个自己的问题。