Articles of gcc

编译错误:“g ++:错误尝试执行'cc1plus':execvp:没有这样的文件或目录”

当我用php popen编译C / C ++程序…我得到这个错误: g++: error trying to exec 'cc1plus': execvp: No such file or directory 但如果我在shell中运行的PHP代码..它工作正常.. 在Arch Linux中 PHP代码: <?php function rfile($fp) { $out=""; while (!feof($fp)) { $out.= fgets($fp, 1024000); } return $out; } $p = popen('g++ -Wall -g aplusb.cc -o aplusb 2>&1', 'r'); $result = rfile($p); pclose($p); echo $result; ?> 谢谢

共享库(.so)如何调用在其加载程序中实现的函数?

我有一个共享库,我实现了,我想要.so调用加载该库的主程序中的函数。 假设我有main.c(可执行文件),其中包含: void inmain_function(void*); dlopen("libmy.so"); 在my.c(libmy.so的代码)中,我想调用inmain_function : inmain_function(NULL); 无论inmain_function是否定义,共享库如何调用inmain_function 。 注意:我想从my.c中调用main.c中的一个符号,反之亦然,这是常见的用法。

版本'CXXABI_1.3.8'找不到(需要…)

当我编译后运行我的程序时,出现以下错误: ./prog:/usr/lib/x86_64-linux-gnu/libstdc++.so.6:版本CXXABI_1.3.8' not found (required by ./prog) ./prog: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version GLIBCXX_3.4.19'找不到(需要./prog)./prog:/usr/lib/x86_64-linux-gnu/libstdc++.so.6:找不到版本'GLIBCXX_3.4.20'( /home/arman/lib/boost_1_55_0/stage/lib/libboost_serialization.so.1.55.0需要) 我同时在~/lib/boost_1_55_0和~/lib/gcc-4.9.0分别安装了~/lib/boost_1_55_0和~/lib/gcc-4.9.0 ,我猜这就是为什么我有问题,但是我不确定关于如何去解决它。 我的~/.profile包含以下行: export LD_LIBRARY_PATH = / home / user / lib / boost_1_55_0 / stage / lib:$ LD_LIBRARY_PATH

实现sizeof运算符

我已经尝试实施sizeof运算符..我已经这样做了.. #define my_sizeof(x) ((&x + 1) – &x) 但是最终总是以任一数据types给出结果为'1'。 我已经为此search了它..我发现代码typecasted #define my_size(x) ((char *)(&x + 1) – (char *)&x) 而代码工作,如果它是typecasted ..我不明白为什么..这个代码也填充结构完美.. 它也在为 #define my_sizeof(x) (unsigned int)(&x + 1) – (unsigned int)(&x) 任何人都可以请解释它是如何工作,如果typecasted,如果没有typecasted? 提前致谢..

什么是build立共享库的“soname”选项?

我学到了“ 程序库HOWTO ”。 它提到使用sonamepipe理版本如下。 gcc -shared -fPIC -Wl,-soname,libfoo.so.1 -o libfoo.so.1.0.0 foo.c ln -s libfoo.so.1.0.0 libfoo.so.1 ln -s libfoo.so.1 libfoo.so 而且我得到的信息,如果soname没有设置。 它将等于libfoo.so.1.0.0,从这里看到答案。 我发现它也可以没有soname,如下所示 gcc -shared -fPIC -o libfoo.so.1.0.0 foo.c ln -s libfoo.so.1.0.0 libfoo.so.1 ln -s libfoo.so.1 libfoo.so 所以我认为唯一有用的一点是,当使用readelf -d libfoo.so命令检查共享库时, soname选项可以告诉你共享库的版本。 还有什么可以做的?

静态链接glibc和libstdc ++

我正在编写一个不兼容GNU GPL的跨平台应用程序。 我目前面临的主要问题是应用程序与glibc和libstdc ++dynamic链接,几乎每个库的新主要更新都不是向后兼容的。 因此,在我的应用程序中看到随机崩溃。 作为一种解决方法,我分发了在几个不同系统上编译的应用程序的二进制文件(使用不同的C / C ++运行时版本)。 但是我不想这样做。 所以我的问题是,保持许可和一切记住,我可以链接反对glibc和libstdc ++静态? 此外,这会导致问题与rtld?

Linux转换时间(不同的时区)到UTC

有没有办法,在Linux中,有问题得到一个给定的时间string的UTC时间 Tue Dec 14 10:30:23 PST 2012 Tue Jan 4 11:30:23 EST 2013 到UTC时间,而不考虑(也不改变)本地时区设置?

便利库中的符号不​​能以可执行文件导出

我有一个程序myprogram ,它与一个静态便利库链接,称之为libconvenience.a ,其中包含一个函数func() 。 函数func()在myprogram任何地方都没有调用。 它需要能够从插件库plugin.so 。 符号func()不会在myprogramdynamic导出。 如果我跑 nm myprogram | grep func 我什么也得不到 但是,它不是从libconvenience.a丢失的: nm libconvenience/libconvenience.a | grep func 00000000 T func 我正在使用automake,但是如果我在命令行上手动执行最后一个链接步骤,则它也不起作用: gcc -Wl,–export-dynamic -o myprogram *.o libconvenience/libconvenience.a `pkg-config –libs somelibraries` 但是,如果我像这样链接程序,跳过使用便利库并直接连接到libconvenience.a的目标文件, func()显示在myprogram的符号中,如下所示: gcc -Wl,–export-dynamic -o myprogram *.o libconvenience/*.o `pkg-config –libs somelibraries` 如果我在myprogram某个地方添加了一个虚func()给func() ,那么func()也会出现在myprogram的符号中。 但是我认为–export-dynamic应该导出所有符号,不pipe它们是否在程序中使用! 我在Fedora 14上使用automake 1.11.1和gcc 4.5.1。我也使用Libtool 2.2.10构buildplugin.so (但不是便利库)。 我没有忘记在myprogram_LDFLAGS中libconvenience_a_SOURCES […]

将g ++ 4.8链接到libstdc ++

我在桌面上下载并构build了gcc 4.8.1,运行64位Ubuntu 12.04。 我build立它的源头,如文档build议,并与命令 ../../gcc-4.8.1/configure –prefix=$HOME –program-suffix=-4.8 make make -k check make install 它似乎通过了所有的testing,我把所有的东西都安装到我的主目录(后缀为-4.8),以便与系统gcc(版本4.6.3)区分开来。 不幸的是,当我使用g ++ – 4.8编译c ++程序时,它链接到系统libc和libstdc ++,而不是从gcc-4.8.1编译的新程序。 我下载并构build了gcc 4.8,因为我想在标准库中使用新的C ++ 11function,所以这种行为绝对不是我想要的。 我能做些什么来让gcc-4.8自动链接到它附带的标准库,而不是系统标准库?

如何将Linux 32位gcc内联汇编转换为64位代码?

我试图在Linux中使用gcc将RR0D Rasta Ring 0 Debugger从32位模式转换为64位模式(长模式)。 我熟悉x86 32位程序集(在MS-DOS环境下),但我是x86 64位程序集和Linux汇编程序devise的初学者。 此项目是为生产使用(我需要一个工作的非源代码debugging器),但我也试图学习如何做32位到64位转换。 如果可能的话,我试图find一种通用的方法来进行32位到64位的转换,这些转换可以在任何使用正则expression式的32位程序上完成(这样可以自动化)。 我知道没有一个通用的解决scheme(64位代码可能比32位代码占用更多的空间,并消耗更多的堆栈等),但即使在这种情况下,自动转换的代码将作为一个起点。 这个想法是保持8位和16位操作数,并用64位操作数replace32位操作数。 这种方法自然会失败,如果pushw %ax; pushw %bx; popl %ecx pushw %ax; pushw %bx; popl %ecx pushw %ax; pushw %bx; popl %ecx被pushw %ax; pushw %bx; popq %rcxreplacepushw %ax; pushw %bx; popq %rcx pushw %ax; pushw %bx; popq %rcx pushw %ax; pushw %bx; popq %rcx ,但行为良好的程序通常不会push两个16位操作数,然后pop一个32位操作数,或者他们? 到目前为止,这些转换是: 编辑:修正: […]