Articles of gcc

C ++ 11:g ++ – 4.7内部编译错误

以下代码: #include <iostream> #include <array> using namespace std; constexpr int N = 1000000; constexpr int f(int x) { return x*2; } typedef array<int, N> A; template<int… i> struct F { static constexpr A f() { return A{{ ::f(i)… }}; } }; template<class A, class B> struct C {}; template<int… i, int… j> struct C<F<i…>, F<j…>> […]

使用Cython将Python编译为C

我正在尝试使用cython将python源代码foo.py编译成C cython 。 在foo.py : print "Hello World" 我正在运行的命令是cython foo.py 问题是,使用gcc编译foo.c时,出现错误: undefined reference to 'main' 。

有什么办法可以在Linux的32位程序中获得64位的time_t

在Windows上,我可以打电话给: _time32(__time32_t); // to get 32bit time_t _time64(__time64_t); // to get 64bit time_t (在32位和64位程序中) 有没有办法在Linux(这与GCC编译)这样做?

gcc – / usr / bin / ld错误:无法在/ usr / local / lib中find<library>,但ldconfig列出它,path添加到ld.so.conf

我尝试编译一个C ++代码,使用我也手动编译并安装在/ usr / local / lib中的库 在链接步骤中,软件的编译失败: /usr/bin/ld: error: cannot find -lcppdb g ++似乎不会在/usr/local/lib默认search,对于clang++ g++ -print-search-dirs # does not show /usr/local/lib 然而事实是/usr/local/lib在我的/etc/ld.so.conf而且我以root身份运行了ldconfig ,并且实际运行了ldconfig -p | grep cppdb ldconfig -p | grep cppdb显示我 libcppdb_sqlite3.so.0 (libc6) => /usr/local/lib/libcppdb_sqlite3.so.0 libcppdb_sqlite3.so (libc6) => /usr/local/lib/libcppdb_sqlite3.so libcppdb.so.0 (libc6) => /usr/local/lib/libcppdb.so.0 libcppdb.so (libc6) => /usr/local/lib/libcppdb.so 添加-L/usr/local/lib选项当然解决了这个问题,但是目标是使用configuration文件

为了分析(-pg),为什么我的代码在multithreading下比使用单线程运行速度慢?

我正在写一个射线追踪器。 最近,我在该程序中添加了线程,利用我的i5四核上的附加内核。 在奇怪的一系列事件中,应用程序的debugging版本现在运行速度较慢,但​​优化后的版本运行速度比添加线程之前要快。 我将“-g -pg”标志传递给gcc用于debugging构build,并将优化构build的“-O3”标志传递给gcc。 主机系统:Ubuntu Linux 10.4 AMD64。 我知道debugging符号为程序增加了大量的开销,但相对的性能一直保持。 即更快的algorithm在debugging和优化构build中总是运行得更快。 任何想法,为什么我看到这种行为? debugging版本是用“-g3 -pg”编译的。 使用“-O3”优化版本。 Optimized no threading: 0m4.864s Optimized threading: 0m2.075s Debug no threading: 0m30.351s Debug threading: 0m39.860s Debug threading after "strip": 0m39.767s Debug no threading (no-pg): 0m10.428s Debug threading (no-pg): 0m4.045s 这使我确信,“-g3”不是怪怪性能差异的三angular洲,而是“-pg”开关。 “-pg”选项可能会添加某种locking机制来衡量线程性能。 由于“-pg”在线程应用程序中被破坏了,我只是删除它。

如何用C语言的内存地址映射函数名和行号?

如何在GCC中将函数名和行号映射回内存地址? 即假设一个C语言的原型: void func() { // Get the address of caller , maybe this could be avoided MemoryAddress = get_call_address(); // Which line from source code is executing , which calls func() LineNumber = get_lineno_from_symbol ( &MemoryAddress ); // Grab the name who calls func() FunctionName = get_func_from_symbol ( &MemoryAddress ); } 那么GCC提供的任何现有的API或其他什么都可以满足我的要求? 非常感谢你们的答复;

为什么gcc重新sorting函数中的局部variables?

我写了一个只读/写大型数组的C程序。 我用gcc -O0 program.c -o program编译了程序出于好奇,我用objdump -S命令来objdump -S C程序。 read_array和write_array函数的代码和程序集附在这个问题的末尾。 我正试图解释gcc如何编译函数。 我用//添加我的评论和问题 以write_array()函数的汇编代码的开始部分为write_array() 4008c1: 48 89 7d e8 mov %rdi,-0x18(%rbp) // this is the first parameter of the fuction 4008c5: 48 89 75 e0 mov %rsi,-0x20(%rbp) // this is the second parameter of the fuction 4008c9: c6 45 ff 01 movb $0x1,-0x1(%rbp) // comparing with […]

缓冲区溢出在64位

我正在试图用缓冲区溢出做一些有趣的实验。 我正在阅读这个论坛的主题,并试图写我自己的小代码。 所以我做的是一个小的“C”程序,它需要字符参数并运行,直到分段错误。 所以我提供的参数,直到我得到一个消息,我用41代替了返回地址。我的缓冲区字符长度,我复制我的inputstring是[5]。 这是我在gdb中做的。 run $(perl -e 'print "A"x32 ; ') Program received signal SIGSEGV, Segmentation fault. 0x0000000000400516 in main (argc=Cannot access memory at address 0x414141414141412d 然后我发现需要16个'A'来覆盖。 run $(perl -e 'print "A"x16 . "C"x8 . "B"x32 ; ') 0x0000000000400516 in main (argc=Cannot access memory at address 0x434343434343432f ) 这告诉我们8“C”正在覆盖返回地址。 根据在线教程,如果我提供了一个有效的地址,而不是8“C”。 我可以跳到某个地方并执行代码。 所以我在初始的16“A”之后超载了内存。 下一步是执行 run […]

不共享与共享库的所有类

像win32一样丑陋微软编译器是通过使用__declspecmacros,它确实具有明确你想要导出或不导出的好处。 现在将相同的代码移到Linux gnu / gcc系统上意味着所有的类都被导出!(?) 这是真的吗? 有没有办法不在gcc下的共享库中导出类? #ifndef WIN32 #define __IMPEXP__ #else #undef __IMPEXP__ #ifdef __BUILDING_PULSETRACKER__ #define __IMPEXP__ __declspec(dllexport) #else #define __IMPEXP__ __declspec(dllimport) #endif // __BUILDING_PULSETRACKER__ #endif // _WIN32 class __IMPEXP__ MyClass { … }

如何在Linux上加载共享库延迟

我一直在寻找一种方法来创build一个共享库(让我们命名库“ libbar.so ”) 延迟加载到Linux上,它应该只有一个链接器的帮助下实现,而不是修改任何写在源代码上的东西C ++; 我的意思是我不想在父库的源代码中调用dlopen()和dlsym() (我们将其命名为“ libfoo.so ”)来调用libbar.so的函数,因为它们会使源代码变得混乱,维护过程困难。 (简而言之,即使在Linux上,我也希望继续使用Visual Studio的/ DELAYLOAD选项) 无论如何,到目前为止,我在互联网上发现了一些与我的问题有关的不确定的信息,所以如果能得到你们所有人的回答,我们将会非常高兴地回答以下问题,以使信息清晰。 GNU ld是否支持Linux上的延迟加载机制? 如果没有,那么Clang呢? dlopen()系列是在Linux上加载共享库延迟的唯一方法吗? 我testing了通过-zlazy标志GCC(g ++)的path到库,它似乎接受的标志,但行为没有看起来使libbar.so延迟加载(没有libbar.so ,我期待有一个第一次调用libbar.so时出现exception,但在进入libfoo.so之前实际发生exception)。 另一方面,铿锵(铿锵++)留下一个警告,它忽略了选项标志。 最好的祝福,