草庐IT

c - 在 Linux 上使用 gcc 并在 Windows 上使用 MinGW 构建共享库

我在生成build设置时遇到了问题,该设置允许分别使用gcc和MinGW在Linux和Windows中构建共享库。在Linux中,共享库不必在编译时解决所有依赖关系;而在Windows中似乎就是这种情况。这是问题设置:$catfoo.h#ifndefFOO_H#defineFOO_Hvoidprintme();#endif$catfoo.c#include"foo.h"#includevoidprintme(){printf("HelloWorld!\n");}$catbar.h#ifndefBAR_H#defineBAR_Hvoidprintme2();#endif$catbar.c

linux - 是什么让 gcc std::list 排序实现如此之快?

我有一个链表实现,我正在试验Mergesort和QuickSort算法。我不明白的是为什么std::list中的排序操作这么快。查看linux下的std::list,它似乎也是链表,而不是基于数组的列表。我在这里尝试的合并排序与DaveGamble的版本几乎相同:MergeSortaLinkedList另外,我想我会尝试基于这段代码的简单快速排序:http://www.flipcode.com/archives/Quick_Sort_On_Linked_List.shtml令人惊讶的是,使用std::list对1000万个随机数进行排序并排序比其他任何一个快大约10倍。对于那些提问的人

linux - 为什么 gcc 为 x64 共享库强制 PIC?

尝试使用gcc将非PIC代码编译到x64上的共享库会导致错误,类似于:/usr/bin/ld:/tmp/ccQ2ttcT.o:relocationR_X86_64_32against`alocalsymbol'cannotbeusedwhenmakingasharedobject;recompilewith-fPIC这个问题是关于为什么会这样。我知道x64具有RIP相对寻址,旨在提高PIC代码的效率。然而,这并不意味着加载时重定位不能(理论上)应用于此类代码。一些在线资源,包括thisone(在这个问题上被广泛引用)声称在共享库中存在一些禁止非PIC代码的固有限制,因为RIP相对寻址。

linux - GCC 4.7.2 需要 ppl?

我正在尝试配置GCC4.7.2,但失败了configure:error:UnabletofindausablePPL我查看了GCCprerequisitespage并且PPL没有在任何地方被提及。我正在使用CLooG0.17.0,它使用ISL,因此不再需要PPL(据我所知)GCC中是否对PPL有其他一些要求,这意味着我仍然需要PPL,或者我的configure中是否缺少一些标志?行?我将以下选项传递给configure:--enable-cloog-backend=isl--with-cloog=$PREFIX--with-isl=$PREFIX--with-gmp=$PREFIX--

c - GCC 在编译时在/usr/local/include 中查找头文件,但在链接时不在/usr/local/lib 中查找库。为什么?

我已经在/usr/中安装了发行版提供的SQLite版本-版本3.4.2。我已经安装在/usr/local/SQLite版本3.7.4。/usr/include/sqlite3.h将SQLITE_VERSION_NUMBER定义为3004002/usr/local/include/sqlite3.h将SQLITE_VERSION_NUMBER定义为3007004版本3007004有函数sqlite3_initialize(),版本3004002没有。$nm-D/usr/local/lib/libsqlite3.so|grepsqlite3_initialize00018e20Tsqlit

linux - gcc -mpreferred-stack-boundary 选项

我想知道在GNU编译器中编译期间-mpreferred-stack-boundary选项有什么用。我已经检查了文档,但我失去了解释。有人可以解释一下吗。 最佳答案 Iwanttoknowwhat'stheuseof-mpreferred-stack-boundaryoptionduringcompilationinGNUdebugger.该选项绝对没有与调试器有关。它会影响二进制文件中生成的代码。默认情况下,GCC将进行安排,以便每个函数在进入时立即将其堆栈指针对齐到16字节边界(如果您有局部变量并启用sse2指令,这可能很重要)。

c - GCC 4.7 字符串文字的源字符编码和执行字符编码?

Linux/x86_64上的GCC4.7是否有默认的字符编码来验证和解码C源文件中字符串文字的内容?这是可配置的吗?此外,当将字符串数据从字符串文字链接到输出的数据部分时,它是否具有默认的执行字符编码?这是可配置的吗?在任何配置中,源字符编码都可能不同于执行字符编码吗?(也就是说,gcc会在字符编码之间进行转码吗?) 最佳答案 我不知道这些选项的实际效果如何(不使用它们atm;我仍然更喜欢将字符串文字视为“仅ASCII”,因为无论如何本地化字符串都来自外部文件,所以它主要是格式字符串或文件名之类的东西),但他们添加了选项,例如-fe

linux - gcc、icc 或 Microsoft 的 C/C++ 编译器是否支持或了解 NUMA?

如果我的多处理器板有cache-coherentnon-uniformmemoryaccess(NUMA),即分开"northbridges"每个处理器都有单独的RAM,是否有任何编译器知道如何在不同的内存系统中自动传播数据,以便在本地线程上工作的进程主要从与线程正在运行的处理器关联的RAM中检索数据?我有一个设置,其中1GB连接到处理器0,1GB连接到处理器1,等等。最多4个处理器。在coherentmemoryspace第一个处理器上RAM的物理内存是地址0到1GB-1。对于第二个处理器,它是1GB到2GB-1,依此类推。是否会有任何编译器,或者特别是malloc,将进程在特定核心

linux - 在 64 位 Linux 机器上的 gcc 中制作 'long' 4 字节

我正在努力将应用程序移植到Linux平台上的64位。该应用程序目前支持Linux、Windows、Mac32位和Windows64位。我们经常遇到的问题之一是将long用于int,反之亦然。直到现在这还不是问题,因为long和int在当前支持应用程序的平台上是可以互换的(都是4字节)。代码库非常庞大,其中包含许多包含许多数据类型的#defines的遗留代码,这使得搜索long的所有用法并适本地替换为int变得很麻烦。作为短期解决方案,有没有办法让GCC使用4个字节而不是8个字节来表示“long”?如果有,我们可能会面临哪些问题?如果没有,是否有更简单的方法来解决long和int问题?

c++ - gcc编译的二进制文件大小不同?

如果使用gcc在不同时间构建相同的代码,生成的二进制文件将具有不同的内容。好吧,我对此并不狂热,但事实就是如此。但是,我最近遇到了这样一种情况,即使用相同版本的gcc构建的相同代码生成的二进制文件的大小与之前的构建不同(大约1900字节)。有谁知道可能导致这些情况的原因是什么?这是某种ELF问题吗?是否有任何工具(ldd除外)可用于转储二进制文件的内容以查看到底有什么不同?提前致谢。 最佳答案 我已经设法解决问题,至少令我满意,并且想传递我的发现。使用readelf,(readelf-a-W)我创建了一个报告,列出了两个构建的内容并