Articles of gcc

如何使用-std = gnu99编译Linux内核模块?

我最近学会了如何编写简单的字符驱动程序,并且在使用代码的同时,我注意到我的C99代码中出现了很多下面的GCC警告: warning: ISO C90 forbids mixed declarations and code 我认为这是因为主要的Linux内核Makefile被设置为使用非C99标准进行编译。 我周围search我在这里find了这个答案在stackoverflow: 如何使用make和编译为C99? 所以我自然在我的Makefile中尝试了以下内容: ccflags-y := -std=gnu99 不幸的是,这并没有消除GCC警告。 我检查了make的详细输出并validation了GCC确实是在最后加上-std=gnu99执行的。 所以我有点困惑。 如何使用-std=gnu99选项正确编译Linux内核模块? 编辑 : 我注意到GCC输出显示了这个选项: -Wdeclaration-after-statement 。 这就是为什么我即使使用-std=gnu99选项也会得到警告?

安装捆绑使用rvm,ruby1.8.7与Linux上的GCC 4.7

在linux(Fedora 17,Arch等)上安装ruby 1.8.7或者安装GCC 4.7的bundle gem。 这个问题发生在我使用RVM的时候。 我能够安装1.8.7,但无法安装捆绑软件gem。 我会收到以下错误: $ gem install bundler ~/.rvm/rubies/ruby-1.8.7-p358/lib/ruby/1.8/timeout.rb:60: [BUG] Segmentation fault ruby 1.8.7 (2012-02-08 patchlevel 358) [x86_64-linux] 这个问题在很多地方都有描述,其中包括: ruby-enterprise 1.8.7-12:timeout.rb:60:[BUG]分割错误 ruby安装是seg错误 rvm在archlinux上安装rbx失败(mri 1.8 + gcc 4.7问题) ruby1.8:使用gcc-4.7编译时的段错误 Ruby 1.8.7无法构build(Arch Linux,gcc> 4.6)

如何在Linux上用GCC编译C和Gtk +?

我search和search,但我没有得到我真正想要的信息。 有人可以请尽可能完全和根本地解释在Linux上使用GCC编写C时如何编译Gtk +代码。 有一些像反引号,“c99”和.o文件,我根本不明白。 我也很感激任何学习Gtk +代码的资源。 我发现所有的来源是版本2.x,但我认为3.6是当前版本。 我想重申,我只对C代码感兴趣。 请不要尝试向我解释C ++或C#的好处,我已经阅读了所有这些。 我在这里为C.谢谢!

如何处理链接器错误:错误 – 找不到-lgcc

这是我的makefile: task0 : main.o numbers.o add.o gcc -m32 -g -Wall -o task0 main.o numbers.o add.o main.o : main.c gcc -g -Wall -m32 -ansi -c -o main.c numbers.o : numbers.c gcc -g -Wall -m32 -ansi -c -o numbers.c add.o: add.s nasm -g -f elf -w+all -o add.o add.s clean : rm -f *.o task0 这是terminal输出: gcc […]

如果ASLR被禁用,mmap是确定性的吗?

如果地址空间布局随机化(ASLR)被禁用,我们是否有确定性的mmap ? 通过确定性,我的意思是说,如果我用相同的input一次又一次地运行相同的应用程序,我会得到相同的地址由mmap返回? 我最感兴趣的是匿名的mmap。

当传递参数作为编译时间常量或variables时,函数性能之间的差异

在Linux内核代码中有一个用于testing的macros(Linux版本2.6.2): #define test_bit(nr, addr) \ (__builtin_constant_p((nr)) \ ? constant_test_bit((nr), (addr)) \ : variable_test_bit((nr), (addr))) 其中constant_test_bit和variable_test_bit被定义为: static inline int constant_test_bit(int nr, const volatile unsigned long *addr ) { return ((1UL << (nr & 31)) & (addr[nr >> 5])) != 0; } static __inline__ int variable_test_bit(int nr, const volatile unsigned long *addr) { int oldbit; __asm__ __volatile__( […]

默认析构函数的gccexception说明

class A { public: virtual ~A() { } }; class B : virtual public A { public: ~B() throw() {} }; class C : public B { }; int main(int argc, char * argv []) { return 0; } 该代码给出了以下错误: error: looser throw specifier for 'virtual C::~C()' error: overriding 'virtual B::~B() throw ()' 在我的debiantesting(gcc(Debian 4.6.0-10)4.6.1 […]

跨平台浮点一致性

我正在开发一个使用锁步模型在networking上播放的跨平台游戏。 作为一个简要的概述,这意味着只有input被传送,所有的游戏逻辑都在每个客户端的计算机上被模拟。 因此,一致性和决定论是非常重要的。 我正在编译使用GCC 4.8.1的MinGW32上的Windows版本,在Linux上我使用GCC 4.8.2编译。 最近让我感到震惊的是,当我的Linux版本连接到我的Windows版本时,即使在两台机器上都编译了相同的代码,程序也会立即发散或者解除同步! 原来问题是Linux版本是通过64位编译的,而Windows版本是32位的。 编译Linux 32位版本后,我很高兴地解决了这个问题。 然而,这让我思考和研究浮点确定性。 这是我所收集的: 一个程序通常是一致的,如果是: 跑在同一架构上 使用相同的编译器编译 所以如果我假设,针对个人电脑市场,每个人都有一个x86处理器,那么解决了要求之一。 但是,第二个要求似乎有点愚蠢。 MinGW,GCC和Clang(分别是Windows,Linux,Mac)都是基于/兼容GCC的不同编译器。 这是否意味着实现跨平台决定论是不可能的? 还是只适用于Visual C ++ vs GCC? 同样,优化标志-O1或-O2是否会影响这种确定性? 离开他们会更安全吗? 最后,我有三个问题要问: 1)在编译器中使用MinGW,GCC和Clang时,是否可以实现跨平台的确定性? 2)这些编译器应该设置哪些标记以确保操作系统/ CPU之间的最一致性? 3)浮点精度对我来说并不重要,重要的是它们是一致的。 有没有办法把浮点数降低到一个较低的精度(比如3-4位小数),以确保系统间的小舍入误差不存在? (到目前为止我尝试写的每个实现都失败了) 编辑:我做了一些跨平台的实验。 使用漂浮点的速度和位置,我保持一个Linux英特尔笔记本电脑和一个Windows AMD桌面计算机同步浮点值的小数点后15位。 但是这两个系统都是x86_64。 testing很简单 – 只是通过networking移动实体,试图确定任何可见的错误。 如果x86计算机连接到x86_64计算机,那么假设相同的结果是有效的呢? (32位与64位操作系统)

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' 。