标签: gcc4.6

你能混合使用同一编译器的不同版本编译的c ++吗?

例如,我可以将一组已编译成GCC-4.6的库与GCC-4.9混合使用.

我知道不同的编译器"品种"如VS不能与MinGW但可以不同代的同一编译器?问题可能会发生吗?如果是这样的话?

c++ gcc abi gcc4.6 gcc4.9

23
推荐指数
1
解决办法
1万
查看次数

C++依赖于const引用的参数不会改变

请考虑以下代码:

void func1(const int &i);
void func2(int i);

void f()
{
  int a=12;
  func1(a);
  func2(a);
}
Run Code Online (Sandbox Code Playgroud)

用g ++ 4.6和-O3编译,我可以看到编译后重新读取函数调用之间的"a"值.将a的定义更改为"const int",编译器不会这样做,而是简单地将立即值"12"加载到edi中.如果a不是const,则同样如此,但我将func1的签名更改为按值接受.

虽然不是代码生成中的错误,但这仍然是奇怪的行为.因为func1承诺不改变a,为什么编译器的代码会根据a是否为const而改变?

编辑:一些怀疑论者声称我可能正在阅读错误的代码.上面的代码使用-S编译产生以下代码:

_Z1fv:
.LFB0:
        .cfi_startproc
        subq    $24, %rsp
        .cfi_def_cfa_offset 32
        leaq    12(%rsp), %rdi
        movl    $12, 12(%rsp)                                                          
        call    _Z5func1RKi
        movl    12(%rsp), %edi     <-- Rereading a
        call    _Z5func2i
        addq    $24, %rsp
        .cfi_def_cfa_offset 8
        ret
        .cfi_endproc                                                           
Run Code Online (Sandbox Code Playgroud)

将a更改为const会产生:

_Z1fv:
.LFB0:
        .cfi_startproc
        subq    $24, %rsp
        .cfi_def_cfa_offset 32
        leaq    12(%rsp), %rdi
        movl    $12, 12(%rsp)
        call    _Z5func1RKi
        movl    $12, %edi          <-- Use immediate value
        call    _Z5func2i …
Run Code Online (Sandbox Code Playgroud)

c++ gcc gcc4.6

8
推荐指数
1
解决办法
190
查看次数

Linux上的这个GCC错误是什么,我该如何解决?gcc:内部编译器错误:非法指令(程序为)

我输入gcc hello.c,然后出现:

gcc: internal compiler error: Illegal instruction (program as)
Please submit a full bug report,
with preprocessed source if appropriate.
See <file:///usr/share/doc/gcc-4.6/README.Bugs> for instructions.
Run Code Online (Sandbox Code Playgroud)

hello.c只是:

int main()
{
 return 0;
}
Run Code Online (Sandbox Code Playgroud)

我想不出有什么方法可以让它变得更简单!(printf在那里发生了同样的情况.)

那么:你怎么解决这个问题?我在Raspberry Pi上的Raspian上.

编辑

gcc -v给出

Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/arm-linux-gnueabihf/4.6/lto-wrapper
Target: arm-linux-gnueabihf
Configured with: ../src/configure -v --with-pkgversion='Debian 4.6.3-14+rpi1' --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.6 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --enable-objc-gc --disable-sjlj-exceptions --with-arch=armv6 --with-fpu=vfp --with-float=hard --enable-checking=release …
Run Code Online (Sandbox Code Playgroud)

c gcc raspbian gcc4.6

6
推荐指数
1
解决办法
9784
查看次数

Travis-CI在符号查找错误时失败,在其他地方工作正常

我有一个名为NMatrix的库(技术上是一个Ruby扩展),它是用C和C++编写的.它使用C++模板来管理不同类型,例如,Rational128Rational64.它也有RubyObjectComplex64Complex128.我强制这些模板版本是通过在一个目标文件中创建一些来构建的 - 在一个从库入口点调用的函数中.

它在GCC 4.7中运行得很好,但是当我在Travis-CI上编译时,它在运行时遇到了一个未定义的符号错误:

exposes cblas rot /home/travis/.rvm/rubies/ruby-2.0.0-p247/bin/ruby: symbol lookup error: /home/travis/build/SciRuby/nmatrix/lib/nmatrix.so: undefined symbol: _ZN2nm7ComplexIfEC1ERKNS_10RubyObjectE
Run Code Online (Sandbox Code Playgroud)

未定义的符号是nm::Complex::Complex(nm::RubyObject const&)明确定义和实例化的(见下文).

这是一个简化的版本data.cpp:

#include "data.h"

void nm_init_data() { // called from library entry point
  // These force the compiler to build these versions of the typedef'd templates.
  // I think this is a gross way to do it, but can't find a better idea.
  nm::RubyObject obj(INT2FIX(1));
  nm::Rational32 …
Run Code Online (Sandbox Code Playgroud)

c++ gcc travis-ci gcc4.6

5
推荐指数
0
解决办法
217
查看次数

编译器错误预期嵌套名称说明符

我是这个问题的OP:扩展一个我得到了很好答案的课程.但是,当我尝试编译代码(稍微为我的项目重做)时,我收到以下消息(行号改为反映以下示例代码):

except.h: | 09 | expected nested-name-specifier before ‘handler_t1’
Run Code Online (Sandbox Code Playgroud)

以及更多似乎源于这条线的东西.我是C++的新手,我对答案(以及即将出现的问题)的研究已经产生了这样一个事实:微软的编译器似乎接受了代码,但符合标准的编译器却没有.

我目前拥有的代码如下:

#include <vector>
namespace except
{
  // several other classes and functions which compile and work already
  // (tested and verified) have been snipped out. Entire code is over
  // 1000 lines.

  class Error_Handler
  {
    public:
      using handler_t1 = bool (*)(except::Logic const&);
      std::vector<handler_t1> logic_handlers;

      // a lot more removed because the error has already happened ...
  }
}
Run Code Online (Sandbox Code Playgroud)

阅读链接问题中的代码表明(我的知识有限)它应该都可以工作.

因此,我的问题是:我需要在此声明/定义中进行哪些更改才能使用gcc进行编译(使用-std = C++ 0x进行4.6.3 64位linux编译)?

c++ compiler-errors c++11 gcc4.6

4
推荐指数
1
解决办法
3万
查看次数

如果参数有成员变量则特殊化函数

我有一个模板化的错误报告函数,因为它可以报告许多不同消息类别的错误:

template <typename MSG>
void reportErr(const MSG& msg)
{
    std::cout << "ERROR: " << msg.error << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

然而,某些类型的消息具有可以报告的更详细的错误或其他专门的错误报告,例如

template<>
void reportErr(const SpecificMsg& msg)
{
    std::cout << "ERROR: " << msg.error;
    std::cout << ", details: " << msg.details << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

由于有很多类型SpecificMsg,例如 ,我不想为每种类型创建单独的模板专业化。是否可以为具有成员变量的任何类型创建通用特化/部分特化.details

如果可能的话,我想要一种方法来一般地执行此操作(因此,如果有.details,则一种专业化,如果有.other_info,则另一种专业化,等等)。

编辑:这是明确询问功能。我见过一些代码可以执行类似的操作来专门化模板,但我从未遇到过可以对非成员函数执行我想要的操作的代码。我怀疑将用于类的方法转换为用于函数的方法并不难,但我一直无法弄清楚如何做到这一点。

编辑 2:我的 gcc 版本(4.6.3)似乎不支持完整的 C++11 标准,因此void_t“重复”问题中提到的选项对我不起作用。我的编译器抱怨“‘类型’之前预期有嵌套名称说明符”等,甚至不让我定义 void_t。因此,我从问题中删除了 C++11 标签。

c++ gcc g++ template-specialization gcc4.6

4
推荐指数
1
解决办法
470
查看次数

错误:名称空间'std'中的'mutex'未在gcc 4.6.2中命名类型

简单的程序就像这样

#include <iostream>       // std::cout
#include <thread>         // std::thread
#include <mutex>          // std::mutex

std::mutex mtx;           // mutex for critical section

int main ()
{
     return 0;
}
Run Code Online (Sandbox Code Playgroud)

尝试以下编译

$ /usr/local/Cellar/gcc46/4.6.4/bin/g++-4.6 -std=gnu++0x -I/usr/local/Cellar/gcc46/4.6.4/gcc/include/c++ -L/usr/local/Cellar/gcc46/4.6.4/gcc/lib temp_mutex.cpp 
temp_mutex.cpp:6:1: error: 'mutex' in namespace 'std' does not name a type
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我在Mac上编译.

c++ c++11 gcc4.6

3
推荐指数
1
解决办法
1万
查看次数