Articles of gcc

有没有人用C ++封装函数的例子?

我在网上search了很多,但我找不到一个与g ++一起工作的例子,所有的例子都使用gcc。 我不断收到的错误是 wrap_malloc.o: In function `__wrap_malloc(unsigned int)': wrap_malloc.cc:(.text+0x20): undefined reference to `__real_malloc(unsigned int)' wrap_malloc.o: In function `main': wrap_malloc.cc:(.text+0x37): undefined reference to `__wrap_malloc' collect2: ld returned 1 exit status 创build这个错误的代码如下(如果我使用gcc进行编译并将头文件从cstdio更改为stdio.h,则此代码有效): #include <cstdio> #include <cstdlib> void *__real_malloc(size_t); void *__wrap_malloc(size_t c) { printf("My malloc called with %d\n", c); return __real_malloc(c); } int main(void) { void *ptr = […]

使用交叉编译器编译原生GCC for arm

我期待为ARM系统创build一个GCC的本地版本,我遇到了一些麻烦。 生成机器是i686-linux。 我看到的每个教程都告诉我如何设置实际的交叉编译套件(我已经使用了crosstools-ng)。 但是,我没有看到任何与编译本机ARM GCC有关的东西。 我使用的configurationstring如下,我只设置了标头的sysroot。 我还交叉编译并安装了GMP和MPFR。 ../../gcc-4.3.5/configure –host=arm-unknown-linux-gnueabi –build=i686-build_pc-linux-gnu –target=arm-unknown-linux-gnueabi –prefix=/home/vm/gcc-native/sysroot –with-sysroot=/home/vm/gcc-native/sysroot –enable-shared –enable-threads –disable-libmudflap –disable-libssp –disable-libgomp –disable-libstdcxx-pch –with-gnu-as –with-gnu-ld –enable-languages=c,c++ –enable-symvers=gnu –enable-__cxa_atexit –disable-nls –disable-multilib –with-gmp=/home/vm/gcc-native/sysroot/ –with-mpfr=/home/vm/gcc-native/sysroot/ 海湾合作委员会将build立一段时间,但随后死亡: checking for suffix of object files… configure: error: cannot compute suffix of object files: cannot compile. 我不知道这将甚至会运行在我的系统上,因为我在i686-linux上构build,目标/主机都是arm-linux。 我现在的想法是find一个ltib发行版,看一个GCC的规格文件,并试图遵循所有的步骤。 由于与std命名空间冲突,我的板上运行的GCC无法在我的系统上编译。 任何信息/链接将不胜感激!

STL容器内存问题

我正在用gcc 4.3.2在linux(Fedora 10和CentOS 5)中实现我自己的图库,并使用STL容器,然后我发现内存有问题。 当我build立我的图表时,我使用了足够多的内存来查看顶部或另一个内存使用工具。 我确定我正在释放内存(我一遍又一遍地检查了代码,并使用了valgrind来检查内存泄漏),但内存仍然在使用中(我可以在顶部或cat / proc / meminfo中查看)而当我再次创buildgraphics时,它不会增加内存使用量,显然重新使用分配的内存。 经过几天的debugging,我创build了一个非常简单的代码,有同样的问题。 #include <iostream> #include <list> // Object that occupies 128KB. // Data is not important. class MyObject { public: int * a; int * b; int * c; int * d; MyObject( ) { a = new int[ 8192 ]; b = new int[ 8192 […]

用gcc -pg -g编译后,gmon.out不会写入

使用gcc -pg -g编译C ++程序(至less,这些是我在Makefile中给出的参数;没有任何有关执行命令的确凿证据)。 程序运行到CWD设置为我的主目录正常完成。 没有gmon.out文件写入。 gcc是4.4.7。 操作系统是centos 6。 我的程序是使用fork / exec手动启动的Perl守护进程启动的。 我已经validation了CWD是我的主目录,而且它是可写的,通过让守护进程在执行我的目标程序之前执行touch foo 。 据我所能研究,这应该不会影响程序的分析或写(gmon.out),当它终止(通常)。

在x86_64 Linux中重新部署一个2GB以上的程序的链接器错误?

我有一个用户程序,通常编译有一个入口点在0x400460 ,我不得不重新定位入口点在2GB的Linux内加载的共享库开始。 例如linux-vdso.so.1 => (0x00007fff109cd000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fcd195e6000) /lib64/ld-linux-x86-64.so.2 (0x00007fcd199af000) 我正在使用gcc命令行参数-Wl,-Ttext=0x80000000来指定.text segemnt的开始地址。 问题是,当我给这个参数超过2GB的地址时,我得到一个链接器错误是: gcc test.c -ggdb -Wl,-Ttext=0x80000000 -o test1 /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 0 has invalid symbol index 10 /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 1 has invalid symbol index 11 /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 2 has invalid symbol index 2 /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 3 has invalid symbol index […]

为什么没有math函数的静态库?

只有dynamic库大多没有它们的静态版本是一个标准吗? 我特别要求math图书馆。 在我的Fedora 17(英特尔32处理器上的Linux机器),我有最新的GCC,它有libm-2.15.so和符号链接文件libm.so,但没有libm.a. 我的系统上是否缺lesslibm.a?

运行任何英特尔®AVXfunction后,math函数需要更多的周期

我注意到运行任何英特尔AVXfunction后,math函数(如ceil,round,…)需要更多的CPU周期。 看下面的例子: #include <stdio.h> #include <math.h> #include <immintrin.h> static unsigned long int get_rdtsc(void) { unsigned int a, d; asm volatile("rdtsc" : "=a" (a), "=d" (d)); return (((unsigned long int)a) | (((unsigned long int)d) << 32)); } #define NUM_ITERATIONS 10000000 void run_round() { unsigned long int t1, t2, res, i; double d = 3.2; t1 = […]

优化C ++二维数组

我需要一种方法来表示C ++中的双精度二维数组(密集matrix),并具有绝对最小的访问开销。 我已经在各种linux / unix机器和gcc版本上做了一些时机。 STLvectorvector,声明如下: vector<vector<double> > matrix(n,vector<double>(n)); 并且通过matrix[i][j]进行访问比访问声明的数组慢5%到100% double *matrix = new double[n*n]; 通过内联索引函数matrix[index(i,j)] ,其中index(i,j)计算结果为i + n * j。 其他不用STL排列二维数组的方法 – 一个n指针数组指向每一行的开始,或者定义堆栈上的整个事物为一个常数大小的matrix[n][n] – 几乎完全相同速度为指标函数法。 当开启优化时,最近的GCC版本(> 4.0)似乎能够将STLvector向量编译成几乎与非STL代码相同的效率,但这有点依赖于机器。 我想尽可能使用STL,但是必须select最快的解决scheme。 有没有人有任何与GCC优化STL的经验?

dlclose并不真正卸载共享对象,无论它被调用了多less次

我的程序使用dlopen来加载一个共享对象,然后dlclose卸载它。 有时这个共享对象再次加载。 我注意到静态variables没有重新初始化(这对我的程序是至关重要的),所以我在dlclose后添加了一个testing(使用RTLD_NOLOAD dlopen )来查看库是否真的被卸载。 果然,这仍然是在记忆中。 然后我试着重复调用dlclose直到这个库真的被卸载,但是我得到的是一个无限循环。 这是我用来检查库是否卸载的代码: dlclose(handles[name]); do { void *handle = dlopen(filenames[name], RTLD_NOW | RTLD_NOLOAD); if (!handle) break; dlclose(handle); } while (true); 我的问题是, dlclose后,我的共享对象没有被卸载的可能原因是什么,因为我的dlopen调用是唯一加载的地方。 你能提出一个行动路线来追踪问题的根源吗? 另外,为什么重复调用dlclose没有任何作用,它们都是递减引用计数,不是吗? 编辑:刚刚发现这只发生在我用gcc编译时。 随着叮当 ,一切都很好。

命令用.a文件编译c文件

我有几个.c文件和一个.a目标文件。 我应该使用什么命令与gcc编译到一个exe文件? 如果我们使用makefile,它将如何?