Articles of gcc

共享库path作为可执行目录

为了重用代码,我有一个应用程序被分成几个库。 在Windows上,我所要做的就是将.dll文件放在与可执行文件相同的path中,并自动find它们。 在Linux上(因为它硬编码的path),我必须指定环境variablesLD_LIBRARY_PATH或在可执行文件之前预先加载库。 我已经看到了一些使用-Wl,-rpath=<PATH>链接器选项embeddedpath的东西,我试过了. 作为path。 但是,这只是在当前的工作目录,而不是可执行文件的目录。 有没有一种方法可以在链接器中默认查找共享库的可执行文件的目录(如在Windows上)? 谢谢! 马特

编译器:了解从小程序生成的汇编代码

我正在研究编译器是如何工作的。 我正在通过阅读从小型64位Linux程序反汇编生成的代码来学习。 我写了这个C程序: #include <stdio.h> int main() { for(int i=0;i<10;i++){ int k=0; } } 使用objdump后,我得到: 00000000004004d6 <main>: 4004d6: 55 push rbp 4004d7: 48 89 e5 mov rbp,rsp 4004da: c7 45 f8 00 00 00 00 mov DWORD PTR [rbp-0x8],0x0 4004e1: eb 0b jmp 4004ee <main+0x18> 4004e3: c7 45 fc 00 00 00 00 mov DWORD […]

gcc / usr / bin / ld:错误:找不到-lncurses

我正在运行Ubuntu 12.04,目前我正在开发一个涉及C,OpenGL,茶壶和input法的项目。 当我决定把箭头键作为input时,问题就开始了。 我检查了箭头键的关键代码,但所有的箭头返回0.我抬头如何得到这个工作,我发现conio.h。 不幸的是,这是一个旧的DOS头,不适用于Linux。 然后我find了一个叫做ncurses的替代品。 在安装必要的库之后,紧跟着构build指令,我在main.c源文件中包含curses.h。 当我第一次尝试使用gcc编译时,出现以下错误: main.o:main.c:function _Key: error: undefined reference to 'stdscr' main.o:main.c:function _Key: error: undefined reference to 'wgetch' main.o:main.c:function _Key: error: undefined reference to 'stdscr' main.o:main.c:function _Key: error: undefined reference to 'wgetch' 我通过添加-lncurses到makefile来find一个修复程序,如下所示: SOURCES=main.c main: main.o gcc -lm -lGL -lGLU -lglut -lncurses main.o -o main main.o: main.c gcc -lm -lGL -lGLU […]

fflush()在Linux中不起作用

我在Linux GCC中使用了fflush(),但没有奏效。 有没有这个function的替代品? 这是我的代码: #include<stdio.h> void main() { char ch='y'; while(ch=='y') { int a; printf("Enter some value:"); scanf("%d",&a); fflush(stdin); printf("Do you want to continue?"); scanf("%c",&ch) } 我得到的输出是: Enter some value: 10 然后程序结束。 就这样。 我能在Linux上做什么? 有替代function吗?

C / C ++应用程序中用于分析过多代码大小的一些技术或工具是什么?

我有一个C ++库,生成更大的代码,我真的会期望它正在做什么。 从不到5万行的源代码中,我得到的共享对象几乎是4 MB,而静态存档则是9。这是有问题的,这是因为库的二进制文件非常大,而且更糟糕的是,连接它的简单应用程序通常会增加500到1000 KB代码大小。 用像-Os这样的标志来编译这个库有点帮助,但并不是非常有帮助。 我也尝试过使用GCC的-frepo命令(即使我看过的所有文档都暗示在Linux上collect2会合并重复的模板),模板上的显式模板实例化似乎很可能被重复,但是没有在任何情况下都有实效。 当然我会说“很有可能”,因为就像任何forms的分析一样,这样的猜测几乎总是错的。 有没有一些工具可以很容易地分析代码的大小,或者我可以找出哪些东西占用了太多的空间,或者更一般地说,我应该尝试其他任何东西? 在Linux下工作的东西将是理想的,但我会尽我所能。

在构build期间将静态库链接到共享库?

使用GCC / Linux构build共享库时遇到问题。 目前这个共享库是用GCC / libtool选项“-shared”创build的,一切正常。 现在有两个额外的静态库(.a-files)必须被添加到这个共享库中,因为它们提供了共享所需的一些function。 添加这些静态库的选项“-l”没有帮助,之后他们不是.so文件的一部分。 那么我怎么能强制GCC / libtool真的把这些静态库的代码添加到共享库中呢? 谢谢!

为什么linux内核使用非标准的C(gcc特定function)编码?

Linux内核代码使用“语句expression式”和扩展的types,使其只能在gcc下编译。 更多的是我想,更多的是没有意义的。 它违背了可移植性和标准C的目的(现在的linux内核代码需要一个支持gcc扩展的特定编译器)。 这是一个糟糕的deviseselect,还是有一个特定的原因使Linux内核代码特定于GCC? 编辑:当我说它失败的可移植性,我在不同的情况下使用它。 我认为,通过符合标准C,任何支持标准C的编译器(这正是创build一个标准的目的 – 统一C的所有不同的方言)的接受,因此更便携。 当然,由于海湾合作委员会如此受欢迎,海湾合作委员会支持数亿架构,这条线几乎毫无意义。 我只是问是否有一个不符合标准C的具体理由。

Pyaudio安装错误 – '命令'gcc'失败,退出状态1'

我正在运行Ubuntu 11.04,Python 2.7.1,并希望安装Pyaudio。 所以我跑了, $ sudo easy_install pyaudio 在terminal和进程退出以下错误消息, searchpyaudio 阅读http://pypi.python.org/simple/pyaudio/ 阅读http://people.csail.mit.edu/hubert/pyaudio/ 最佳匹配:pyaudio 0.2.4 正在下载http://people.csail.mit.edu/hubert/pyaudio/packages/pyaudio-0.2.4.tar.gz 处理pyaudio-0.2.4.tar.gz 运行PyAudio-0.2.4 / setup.py -q bdist_egg –dist-dir /tmp/easy_install-0Tetss/PyAudio-0.2.4/egg-dist-tmp-PYy9T8 在/usr/include/python2.7/Python.h:8:0包含的文件中, 来自src / _portaudiomodule.c:30: /usr/include/python2.7/pyconfig.h:1155:0:警告:“_POSIX_C_SOURCE”重新定义 /usr/include/features.h:214:0:注意:这是以前定义的位置 src / _portaudiomodule.c:31:23:致命错误:portaudio.h:没有这样的文件或目录 编译终止。 错误:安装脚本退出错误:命令'gcc'失败,退出状态1 我不确定是否发布在askubuntu.com或在这里stackoveflow,但无论如何这里是在stackoverflow。 另外我google'd有点这个问题,发现通过安装python-dev已经解决了一些问题。 我已经安装了python-dev。 可能出了什么问题? UPDATE 以下是安装libportaudio-dev后得到的新错误, searchpyaudio 阅读http://pypi.python.org/simple/pyaudio/ 阅读http://people.csail.mit.edu/hubert/pyaudio/ 最佳匹配:pyaudio 0.2.4 正在下载http://people.csail.mit.edu/hubert/pyaudio/packages/pyaudio-0.2.4.tar.gz 处理pyaudio-0.2.4.tar.gz 运行PyAudio-0.2.4 / setup.py -q bdist_egg –dist-dir /tmp/easy_install-LMpsIy/PyAudio-0.2.4/egg-dist-tmp-AExlqd 在/usr/include/python2.7/Python.h:8:0包含的文件中, […]

GCC详细模式输出说明

我是新来的Linux。 任何人都可以向我解释我的hello世界程序的详细模式输出? 另外,什么文件crt1.o , crti.o , crtend.o , crtbegin.o和crtn.o和lc和lgcc呢? 任何其他的解释链接也是受欢迎的。 $ gcc -v hello.c Reading specs from /usr/lib/gcc-lib/i686/3.3.1/specs Configured with: ../configure –prefix=/usr Thread model: posix gcc version 3.3.1 /usr/lib/gcc-lib/i686/3.3.1/cc1 -quiet -v -D__GNUC__=3 -D__GNUC_MINOR__=3 -D__GNUC_PATCHLEVEL__=1 hello.c -quiet -dumpbase hello.c -auxbase hello -Wall -version -o /tmp/cceCee26.s GNU C version 3.3.1 (i686-pc-linux-gnu) compiled by GNU C version 3.3.1 […]

C预处理器如何处理循环依赖?

我想知道C预处理器如何处理循环依赖(#defines)。 这是我的程序: #define ONE TWO #define TWO THREE #define THREE ONE int main() { int ONE, TWO, THREE; ONE = 1; TWO = 2; THREE = 3; printf ("ONE, TWO, THREE = %d, %d, %d \n",ONE, TWO, THREE); } 这是预处理器输出。 我无法弄清楚为什么输出是这样的。 我想知道预处理器在这种情况下采取的各种步骤,以提供以下输出。 # 1 "check_macro.c" # 1 "<built-in>" # 1 "<command-line>" # 1 "check_macro.c" int […]