Articles of gcc

如何将二进制数据写入文件以便快速读取?

我需要编写一个将数据写入文件的文件格式,并可以读取它。 它应该能够以相当快的速度读取数据,这应该包括将一大块数据转移到std::vector (因为它们的存储总是连续执行的)。 但是,在编写文件时,我不知道如何强制约束整数和其他types的alignment和大小。 这应该怎么做? 我在Q6600(x86)上的buntu linux上使用gcc。 举个例子: struct Vertex { float point [3]; float normal [3]; float texcoord [2]; } 稍后,数据存储在std::vector<Vertex> 。 我曾考虑过使用__attribute__和打包/alignment它,以便在不同的平台上更具可移植性。 编辑:我已经做了一个规范,我打算使用它。 数据的最大位是顶点和索引,所以这些数据将被读为大块,例如(更大规格的一部分):顶点组是一组共享特征的顶点。 一次只能容纳一种材料,因此网格中应该包含许多材料。 <uint> thisid # Of this VertexGroup <string> name <uint> materialId # A material <uint> vertexCount for (vetexCount): <3xfloat> point <3xfloat> normal <2xfloat> texcoord <uint> triangleCount for (triangleCount): <3xuint> […]

在不相关的进程之间使用消息队列

我正在尝试在Linux中两个不相关的进程之间使用消息队列进行通信。 我知道使用一个公共密钥值将允许我们在两个不相关的进程中打开相同的消息队列。 但是问题在于,某些系统实用程序有时可能已经使用了与消息队列相对应的键值。 所以我正在使用IPC_CREAT | IPC_EXEL标志确保新的消息队列被强制创build。 在msgget()返回错误的情况下,我递增键值并重试创build一个新的消息队列,直到成功。 现在,问题是如何将这个成功的键值传递给想要在相同的消息队列上操作的另一个不相关的进程。 我错过了什么吗? 有没有人遇到过类似的问题?

引用Linux可执行文件的库

我已经用Java编写了一个应用程序,并使用gcj成功编译了它。 它工作得非常好,但是我遇到了一个障碍:我只能通过shell脚本运行可执行文件,因为我必须指定库path。 我需要的库是SWT,Xerces和GNU-crypto。 有没有办法在gcj编译时静态链接库,或者这不是一个好主意? 或者,我可以在编译时指定(相对)库path吗? 目前,我的shell脚本如下所示: #!/bin/sh export LD_LIBRARY_PATH=./libs/:$LD_LIBRARY_PATH exec ./MyJavaApp $*

通过sys / shm.h共享多个variables

我试图使用shm.h库共享两个不同的使用共享内存块。 我写了下面的例子,其中一个共享内存块被创build并且足够大以容纳两个整数。 然后我附加两个整数,并创build两个进程。 第一个进程增加第一个整数。 第二个过程然后打印出两个整数的值。 但是会发生什么呢是两个整数都增加了。 我究竟做错了什么? 我刚开始学习如何使用shm库。 这是代码: #include <sys/sem.h> #include <sys/ipc.h> #include <sys/types.h> #include <sys/shm.h> #include <stdio.h> #include <unistd.h> int main() { // Declare variables int shmID; int *data1; int *data2; // Create a shared memory segment if((shmID=shmget(IPC_PRIVATE, 2*sizeof(int), 0666 | IPC_CREAT))<0) { fprintf(stderr,"Problem initializing shared memory\n"); perror("main"); return -1; } if((data1=shmat(shmID,NULL,0))==(int *)-1) […]

在哪些平台上,libc将堆栈cookie值存储在除__stack_chk_guard以外的其他位置?

例如,Linux / i386上的glibc将cookie存储在%gs:0x14 。 除了__stack_chk_guard符号之外,是否还有其他需要查找的平台来查找Cookie? (这是gcc -fstack-protector生成的代码在函数序言堆栈中存储的值,并在返回防垛堆栈之前检查)。

使崩溃日志有意义(c ++,Linux env)

我有一个编译的c ++应用程序,它崩溃时产生一个堆栈跟踪。 目前,堆栈跟踪并不是特别有意义。 我想处理它,以便它包含符号,而不是地址。 有没有人有任何关于如何去做这件事的指针?

在Linux中静态链接库

我有一个链接到一些库的应用程序,它们中的大多数在我的机器上既可以是静态的,也可以是dynamic的库。 以下是ldd命令的输出。 linux-gate.so.1 => (0xffffe000) libssl.so.0.9.8 => /usr/lib/libssl.so.0.9.8 (0xb782c000) libc.so.6 => /lib/libc.so.6 (0xb76cc000) libcrypto.so.0.9.8 => /usr/lib/libcrypto.so.0.9.8 (0xb755a000) /lib/ld-linux.so.2 (0xb788d000) libdl.so.2 => /lib/libdl.so.2 (0xb7555000) libz.so.1 => /lib/libz.so.1 (0xb7540000) 我想静态链接libssl库,但根据gcc文档,默认情况下,它dynamic链接每个库。 告诉gcc静态链接一个特定库的方法是什么,即使它的dynamic版本也可以在系统上使用?

我可以在Linux中编辑GCC的打印输出吗?

我想错误按摩打印在不同的颜色terminal,这是可能的,以及如何? 我想用红色打印“错误”一词,用黄色打印“警告”一词。 谢谢。

configuration文件不是为所有用户加载的

我最近得到了arm-linux-gcc工具链,并为我的Ubuntu操作系统运行。 我在/ etc / profile文件中configuration了工具链的pathvariables。 我只能以root身份login时才能访问工具链,而且我也必须这样做 source /etc/profile 在每一个会议。 为什么会发生? 为什么我无法从正常的login访问工具链? 问候,

将.a中的链接函数转换为.so

我写了一个共享的libA.so。 我的程序P将dynamic加载libA.so (使用dlopen,dlsym …)。 这是我的问题: 在libA.so中 ,我必须在静态libB.a中使用函数(例如fun1() ),但是libB.a不用-fPIC编译,而且我也不能重新编译libB.a ,所以我不能将libB.a链接到libA.so。 我已经尝试链接libB.a到P (与-Wl , – 整个档案),为了让dynamic加载器链接fun1()到libA.so加载时。 但是,这是行不通的。 我很确定fun1()是在P (我检查它: nm P | grep "fun1" )。 我能怎么做? 提前致谢!