Articles of gcc

剥离Linux共享库

最近我们被要求发布我们的一个库的Linux版本,以前我们已经在Linux下开发并运行Windows,部署库通常要容易得多。 我们遇到的问题是将导出的符号仅剥离到暴露的界面中。 有三个很好的理由想要做到这一点 通过导出的符号来保护我们技术的专有方面。 为了防止用户遇到符号名称冲突的问题。 为了加快图书馆的加载(至less我被告知)。 举一个简单的例子: TEST.CPP #include <cmath> float private_function(float f) { return std::abs(f); } extern "C" float public_function(float f) { return private_function(f); } (g ++ 4.3.2,ld 2.18.93.20081009) g++ -shared -o libtest.so test.cpp -s 并用符号来检查符号 nm -DC libtest.so 给 w _Jv_RegisterClasses 0000047c T private_function(float) 000004ba W std::abs(float) 0000200c A __bss_start w __cxa_finalize w […]

警告:函数的隐式声明“getresuid”(和“seteuid”)

我想摆脱警告。 当我编译的源代码 gcc -Wall -ansi -o test test.c 我回来了 test.c: In function 'main': test.c:12: warning: implicit declaration of function 'getresuid' test.c:14: warning: implicit declaration of function 'seteuid' 当我编译它没有-ansi开关 gcc -Wall -o test test.c 我在terminal上看到 test.c: In function 'main': test.c:12: warning: implicit declaration of function 'getresuid' 我想使用-ansi开关并摆脱警告。 我怎样才能达到我的目标? /* this is the test.c */ #include <stdio.h> […]

Cuda编译器不能使用GCC 4.5 +

我是Cuda新手,我正在编译这个简单的test_1.cu文件: #include <stdio.h> __global__ void kernel(void) { } int main (void) { kernel<<<1,1>>>(); printf( "Hello, World!\n"); return 0; } 使用这个: nvcc test_1.cu 我得到的输出是: In file included from /usr/local/cuda/bin/../include/cuda_runtime.h:59:0, from <command-line>:0: /usr/local/cuda/bin/../include/host_config.h:82:2: error: #error — unsupported GNU version! gcc 4.5 and up are not supported! 我的gcc – 版本: gcc (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1 Copyright (C) 2011 Free […]

使用gcc按位移动的意外行为

我有一个像这样的testing程序: int main() { unsigned n = 32; printf("ans << 32 = 0x%X\n", (~0x0U) << 32); printf("ans >> 32 = 0x%X\n", (~0x0U) >> 32); printf("ans << n(32) = 0x%X\n", (~0x0U) << n); printf("ans >> n(32) = 0x%X\n", (~0x0U) >> n); return 0; } 它产生以下输出: ans << 32 = 0x0 … (1) ans >> 32 = […]

错误:使用&&操作符时使用但未定义的标签

int main() { int i = 0; int *p = &i; int *q = &&i; return 0; } 在Linux上使用gcc进行编译时,出现错误 addr.c: In function 'main': addr.c:6:2: error: label 'i' used but not defined 为什么编译器将int i当作label而不是整数? 我们什么时候使用&& operator ? 编辑 :好的,我可以稍微理解答案,但是你能解释一下“arch / arm / include / asm / processor.h”下面的macros定义。 它没有说label任何内容,但是评论说,它可以返回“ program counter ” /* * Default implementation of […]

有没有办法在Linux系统上禁用CPUcaching(L1 / L2)?

我正在分析Linux系统上的一些代码(在Intel Core i7 4500U上运行)以获得执行成本的时间。 该应用程序是来自libmpeg2的demo mpeg2dec。 我正在尝试获取mpeg2执行时间的概率分布。 但是,我们希望看到cachingclosures时的原始执行成本。 有没有办法通过Linux命令或通过gcc标志禁用我的系统的cpucaching? 甚至将cpu(L1 / L2)caching大小设置为0KB? 甚至添加一些代码更改为禁用caching? 当然,不用修改或重build内核。

“bash:./a.out:'ld`运行的可执行文件上没有这样的文件或目录

这里是一个C世界中的Hello World代码: // ac #include <stdio.h> int main() { printf("Hello world\n"); return 0; } 我把它编译为gcc ac ,它可以像预期的那样产生a.out ,而./a.out打印出Hello world所期望的Hello world 。 现在,如果我分别进行编译和链接: gcc -c ac; ld -lc ao gcc -c ac; ld -lc ao ,它运行a.out生成为./a.out我得到的消息: bash: ./a.out: No such file or directory 我GOOGLE了错误,似乎发生在生成的可执行文件是一个32位ELF和机器体系结构是64位。 我正在运行一个64位的机器和正在运行的file a.out : a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), […]

进程间信号量有时不像预期的那样工作

我有以下C代码,其中以sm为前缀的variables由两个进程proc1和proc2共享。 因此信号量也是共享的。 这个代码被重复调用。 所以如果我说以前的价值,这意味着以前的迭代的价值。 我注意到在我的程序中, proc1有时会传递sem_wait(sem_f2l)而没有proc2执行sem_post(sem_f2l) 。 这我注意到,因为sm_value_proc1和sm_value_proc2应该在我的程序中具有相同的值,这也是由printfs用>>>确认的。 但是,使用<<<的printf有时会显示不同的值。 不同之处在于proc1打印了以前的sm_value_proc2值,因为proc1神秘地不会等待proc2发布sm_f2l 。 任何想法这里怎么了? // semaphores are initialized like this -> sem_init( sm_l2f, 1, 0 ); // Note that sm_l2f and sm_f2l are pointers to sem_t // sm_condition is assigned here by proc1 if ( is_proc1 ) { sem_post( sm_l2f ); // proc2_value should be updated by […]

在Linux上的C ++源文件上运行“gcc”会导致“cc1plus:内存不足……”错误消息

在Ubuntu上使用“gcc”编译C ++源文件时遇到了一个令人困惑的问题。 解决了这个问题之后,我想在这里发表,以解救别人头痛的问题。 为了这个报告,我们有最简单的C ++“Hello,World”程序,存储在main.cpp中: #include <stdio.h> int main (int argc, char *argv[]) { return 0; } 当我运行命令: gcc main.cpp 我收到错误消息: cc1plus: out of memory allocating 1677721600 bytes after a total of 475136 bytes 我证实我正在编译正确的比特(即32位)。 我做错了什么?

/usr/../libstdc++.so.6:未find版本'GLIBCXX_3.4.11'(必需)

我一直被困在这个问题上好几个星期,一直在互联网上寻找解决scheme,但目前为止不太好… 所以我有一个由别人编写的程序,我尝试在Matlab中编译,使其工作。 我的电脑是红帽企业Linux工作站(64位),安装了gcc 4.4.3和Matlab 2011b。 gcc与我的Matlab兼容( http://www.mathworks.com/support/compilers/R2011b/glnxa64.html )。 编译工作正常(我的意思是,没有错误信息发生在Matlab命令窗口)。 但编译之后,每当我使用编译的特定函数(称为“mexLasso”)时,都会显示如下错误: ***无效的MEX文件“/usr/local/matlab_R2011b/toolbox/spams-matlab/build/mexLasso.mexa64”:/usr/local/matlab_R2011b/bin/glnxa64/../../sys/os/glnxa64 /libstdc++.so.6:版本'GLIBCXX_3.4.11'找不到(需要/usr/local/matlab_R2011b/toolbox/spams-matlab/build/mexLasso.mexa64) testing错误(第24行)alpha = mexLasso(X,D,param); * 所以我在terminalinput“strings /usr/lib/libstdc++.so.6 | grep GLIBC”,我发现其中实际上是“GLIBCXX_3.4.11”。 我一直在使用Linux和gcc的东西只有几个月…所以还是有很多东西我不明白。 如果你能详细解释,这将是非常有帮助的。 谢谢!! %%更多详细信息:我从http://spams-devel.gforge.inria.fr/downloads.html获得了有关机器学习的这些程序。 奇怪的是,编译后,该包中的其他function工作正常(如“mexTrainDL”)。