Articles of g ++

g ++默认头包含列表

当在Linux机器(lubuntu 11.10)中使用cross g ++进行编译时,我可以看到默认包含头文件目录的列表: #include <…> search starts here: /opt/eldk-4.2/usr/bin/../lib/gcc/powerpc-linux/4.2.2/include /opt/eldk-4.2/ppc_4xx/usr/include/c++/4.2.2/opt/eldk-4.2/ppc_4xx/usr/include/c++/4.2.2/powerpc-linux /opt/eldk-4.2/ppc_4xx/usr/include/c++/4.2.2/backward /opt/eldk-4.2/usr/../ppc_4xx/usr/include 在另一台Linux机器(lubuntu 12.10)中执行完全相同的g ++二进制文件,我得到另一个不同的列表,其中包含更less的元素: #include <…> search starts here: /opt/eldk-4.2/usr/bin/../lib/gcc/powerpc-linux/4.2.2/include 其中一些元素看起来很糟糕,如下所示: ignoring nonexistent directory "/opt/ppc_4xx/usr/lib/gcc/powerpc-linux/includ../include/c++/4.2.2" 结果是一些编译在第一个系统上的代码不能在第二个编译,因为找不到一些头文件。 为什么会这样呢? 这份清单是从哪里来的? 谁负责构build它? 有没有可能轻易改变它? 任何帮助表示赞赏。

迭代时,C ++列表迭代器永远不会到达end()

好的,我编写了一个程序,在使用Visual C ++编译器编译时运行得非常好。 现在我想将它移植到linux上,但是在linux中编译之后会发生一些奇怪的事情。 所以,我正在尝试使用迭代器遍历列表。 这里代码: for (list<IntermediateRepresentation>::iterator irIt = funcIt->second.prologue.begin(); irIt != funcIt->second.prologue.end(); ++irIt) { irIt->address = address; address += getOpcodeSize(irIt->opcode); } 现在问题是上面的代码导致无限循环。 我试着在debugging器中看到它为什么这样做,我发现列表的最后一个元素(在'end()'之前)是指向'begin()'迭代器,而不是'end( )'迭代器,所以当我调用'++ irIt'时,它返回到'begin()'。 这是一个预期的行为? 而我发现的另一件事是,当我这样做: size_t irSize = funcIt->second.prologue.size(); 这也会导致无限循环,因为它使用类似于我的循环来计算大小。 那么,不能预期行为是对的吗? 任何人都可以给我一些提示,问题可能在哪里? 哦,我正在使用Ubuntu 12.10,g ++版本4.7.2,和eclipse IDE以及Linux GCC作为工具链。 谢谢!

文件描述符在nftw中泄漏(FTW_CHDIR)?

我正在使用POSIX调用nftw()遍历目录结构。 目录结构是平的 – 只有4个文件,没有子目录。 但是,当我在这个平面目录上很多次调用nftw()时,我会在一段时间后收到错误消息: "too many open file handles". 事实certificate,使用标志FTW_CHDIR时会发生这种情况。 你会同意这是一个在Linux实施nftw()的错误? UPDATE glibc存储库现在有一个修复程序可用。 这里有一些链接到我用于testing的源代码: main.cpp: http : //sourceware.org/bugzilla/attachment.cgi? id = 4586&action = view Makefile: http : //sourceware.org/bugzilla/attachment.cgi? id = 4587&action= view UPDATE MacOS-X 也受到这个错误的影响 Solaris9,Solaris10和AIX 5.3 没有这个bug

将应用程序链接到libbz2.so.1而不是libbz2.so.1.0

以下是我目前的情况: 我想在Linux上发布一个二进制应用程序,这个应用程序可以在多个发行版上运行(不是所有的发行版都是主要的,为了讨论的目的,我们把重点放在Ubuntu和Fedora上)。 有问题的应用程序链接到libbz2的一些工作。 一个简单的“你好世界”将说明情况: /* main.cpp */ #include <iostream> int main(int argc, char* argv[]) { std::cout << "Hello World!\n"; return 0; } 该应用程序是这样构build的: g++ -lbz2 -o test.bin main.cpp 我的编译系统是在Ubuntu上。 当我用生成的二进制文件对ldd进行检查时,它将libbz2.so.1.0列为运行时依赖项。 当我将这个应用程序带到Fedora机器上时,该应用程序不运行,ldd显示它找不到libbz2.so.1.0 。 Fedora只有libbz2.so.1和libbz2.so.1.0.4 ,而不是libbz2.so.1.0 。 红帽的Bugzilla数据库显示,这种行为不是一个错误,而是一个function。 我真的不需要libbz2.so.1.0 ,我只是简单地链接到libbz2.so.1满意,但我还没有弄清楚如何。 我在前面看到过类似的问题 ,但接受的答案(您可以在链接器命令行上传递实际的.so文件而不是-l)似乎不起作用。 我试着用下面的命令来build立: g++ /lib/libbz2.so.1 -o test.bin main.cpp 但是,ldd仍然提到应用程序依赖于libbz2.so.1.0 ,即使我将全名传递给g ++。 现在,问题是,在Ubuntu上构build应用程序的方式是否仅依赖于libbz2.so.1而不是libbz2.so.1.0 ? 谢谢。

dlsym()在C ++中的全局variables

我想创build一个能够dlopen()自己编写的一系列库的程序,并运行存储在名为test_suite的全局variables中的所有函数.so文件是一个以NULL结尾的函数指针数组(函数的签名是由我自己定义的,不需要担心)。 问题是g ++这个variables。 该库被编译为: g++ -Wall -shared -rdynamic -fPIC foo.cpp -o foo.so 而“function索引”是静态声明和分配的: const testunit_testcase test_suite = { … } 然而 objdump -t foo.so | grep test_suite 说明: 0000000000200940 l O .data.rel.ro 0000000000000020 _ZL10test_suite 我需要的是 0000000000200940 l O .data.rel.ro 0000000000000020 test_suite 所以我可以dlsym(dlh, "test_suite")在程序中dlopen() ' foo.so 谢谢 附录 是的, extern "C"是我尝试的第一件事情: extern "C" { const testunit_testcase […]

在Ubuntu上为mpi.h设置G ++或ICC

我从未在VS08之外做过任何主要的编程。 我试图用两个相关的make文件中的任何一个编译一个名为LAMMPS的程序。 一个调用g ++,另一个调用icc(Intel的编译器)。 icc产生这个错误: icc -O -DLAMMPS_GZIP -DMPICH_SKIP_MPICXX -DFFT_FFTW -M write_restart.cpp> write_restart.d write_restart.cpp(15):灾难性错误:无法打开源文件“mpi.h”#include“mpi.h” 和g ++抛出这个错误 g ++ -g -O -DLAMMPS_GZIP -DMPICH_SKIP_MPICXX -DFFT_FFTW -M verlet.cpp> verlet.d pointers.h:25:致命错误:mpi.h:没有这样的文件或目录编译终止。 mpi.h文件位于/ usr / lib / openmpi / include中 这是我的理解,我需要设置$ PATHvariables读取 bash:/ usr / local / sbin:/ usr / local / bin:/ usr / sbin:/ usr / bin:/ sbin:/ […]

gcc – 如何find头文件的path

我们有没有在gcc的选项来查找包含特定文件头的位置? 我有以下情况: file_1.h:声明type_1的types file_2.h: type_1 var; 我想检查我正在创build的库中包含的file_1.h的位置。

引发std :: bad_alloc的其他可能的原因

我正在研究一个相当大的SIP电话应用程序,偶尔当我们使用集成的Web UI(使用tntnet编写)在大量调用加载时,程序将由于抛出std :: bad_alloc而退出。 有数百个正在使用的线程(每个活动调用3个),所以导致exception的代码的位置是非常随机的,但总是在使用GUI之后。 现在,我明白std :: bad_alloc可以在内存不足的时候抛出,在这种情况下情况并非如此。 我也在想,当存在堆腐败的时候,它可能会被抛出,我仍然在寻找它可能在代码库中的位置。 但我的问题是,除了内存不足或堆损坏之外,是否还有其他原因会引发std :: bad_alloc? 我在Linux上使用GNU g ++。

用g ++编译多个源代码目录

我的C ++项目有以下结构 src | |source1.cpp |source2.cpp | |<srcfolder1> |__ source11.cpp |__ source12.cpp | |<srcfolder2> |__ source21.cpp |__ source22.cpp 可以看出有多个文件夹和多个源文件。 我给g ++编译所有源文件到一个.o文件的命令是什么?

静态链接仅提升库G ++

可能重复: 链接时可以混合静态和共享对象库吗? 我想编译我的应用程序,静态链接boost_system库。 其他(glibc等)应该dynamic链接。 我该怎么做? 我的命令来dynamic编译: g++ -o newserver server.cpp … -lboost_system -std=c++0x 静态编译命令: g++ -static -o newserver server.cpp … -pthread -lboost_system -std=c++0x 但是这个命令静态链接所有! 和应用程序重量2mb更多! 你能告诉我什么命令静态编译只有升压库? 谢谢!