【问题标题】:Cannot compile C++ code on Linux, but can on Mac OS无法在 Linux 上编译 C++ 代码,但可以在 Mac OS 上编译
【发布时间】:2013-09-25 15:34:23
【问题描述】:

对于我正在进行的项目,我想尝试以下程序: http://sourceforge.net/projects/tirg/

它由两个 C++ 文件组成,但我无法在我的运行 Linux 的笔记本电脑上编译它,而它在我的一个运行 Mac OS 的朋友的笔记本电脑上编译没有任何问题。我在编译 C++ 代码方面没有任何经验,所以这可能是初学者的错误。

运行 Mac OS 并成功编译代码的笔记本电脑使用了以下 g++ 版本:

i686-apple-darwin11-llvm-g++-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)

我尝试在运行 Arch LInux(64 位)的笔记本电脑上使用 gcc、g++、clang 和 clang++ 编译 C++ 文件,版本如下:

gcc and g++ (GCC) 4.8.1 20130725 (prerelease)
clang version 3.3 (tags/RELEASE_33/final)
Target: x86_64-unknown-linux-gnu
Thread model: posix

我在编译时遇到的错误是:

/usr/include/c++/4.8.1/bits/stl_vector.h:1240:36: error: no matching function for call to ‘std::vector<std::vector<unsigned char> >::_M_fill_assign(int&, int&)’
         { _M_fill_assign(__n, __val); }
                                    ^

这是由这行代码引起的:

std::vector<std::vector<trg::Rgb> > a(300, 255);

我已将编译的完整输出放在 pastebin 上: http://pastebin.com/m285PSrH

我在编译 OpenCV 时也遇到了问题,所以我的配置可能有问题。我认为这是版本控制问题,例如标准库的错误版本。

希望有更多 C++ 经验的人能指出可能出了什么问题。谢谢!

【问题讨论】:

  • 什么是max的cpu arch?
  • 该行是否假设创建一个 300x255 矩阵或 300 个向量,其中每个子向量元素初始化为 255?
  • 是的,它应该创建一个矩阵,所以 300 个向量包含 255 个 RGB 值。所以它的意思是向量的大小,而不是一个值。该矩阵用于存储图像的像素值。
  • @Zaibis,我运行 Arch Linux 的笔记本电脑支持 64 位。它包含以下处理器:Intel Core 2 Duo Mobile SU7300

标签: c++ linux compilation compiler-errors


【解决方案1】:
std::vector<std::vector<trg::Rgb> > a(300, 255);

没有意义。 你想写这样的东西:

//std::vector<std::vector<trg::Rgb> > a(picHeight, picWidth);
std::vector<std::vector<trg::Rgb> > a;
a.resize(picWidth);
{   
        std::vector<std::vector<trg::Rgb> >::iterator end = a.end();
        std::vector<std::vector<trg::Rgb> >::iterator it = a.begin();
        for(; it != end; ++it)
                it->resize(picHeight);
} 

您应该更正代码中的每个 assign() 以及对构造函数的每次调用

vector<vector<XX> >

【讨论】:

  • 谢谢!该解决方案确实可以正常工作,但您可能知道为什么它可以在我朋友运行不同版本 GCC 的笔记本电脑上工作。因为确实,标准库的手册说它不应该工作,但显然我的朋友和 C++ 代码的作者正在使用一些代码行确实有意义的版本。
  • GCC 4.2 已经 6 岁了;那时它的标准库中很可能存在错误。
  • 好的,很不幸这是我第一次编译 C++ 的经历。
【解决方案2】:

i686-apple-darwin11-llvm-g++-4.2 做错了。 如果可以进行隐式转换,您将获得向量的 2D 向量。 然而[23.3.6.2]:

显式向量(size_type n);

你可以这样做:

struct Rgb {};
int main() {
    std::vector<Rgb> rgb_vector(255);
    std::vector<std::vector<Rgb> > a(300, rgb_vector);
    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-25
    • 1970-01-01
    • 2016-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-01
    相关资源
    最近更新 更多