为什么我的简单编译会失败?

时间:2015-08-21 15:59:30

标签: c++ openmp

所以我只是从自制软件安装gcc,我有一个简单的代码:

#include <cmath>
#include <iostream>
#include <stdio.h>

int main()
{
    const int size = 256;
    double sinTable[size];

#pragma omp parallel for
    for(int n=0; n<size; ++n)
        sinTable[n] = std::sin(2 * M_PI * n / size);

#pragma omp parallel for
    for(int n=0; n<10; ++n)
    {
        printf(" %d", n);
    }
    printf(".\n");

    // the table is now initialized
}

然而,当我编译时,我失败了:

    dhcp-18-189-47-44:openmp_code myname$ gcc-4.8 tmp2.cpp 
Undefined symbols for architecture x86_64:
  "std::ios_base::Init::Init()", referenced from:
      __static_initialization_and_destruction_0(int, int) in ccFbBrPl.o
  "std::ios_base::Init::~Init()", referenced from:
      __static_initialization_and_destruction_0(int, int) in ccFbBrPl.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status

但是,如果我将其更改为g ++ - 4.8,那么它就会成功...

dhcp-18-189-47-44:openmp_code myname$ g++-4.8 tmp2.cpp -fopenmp

我想知道为什么会发生这种情况......

2 个答案:

答案 0 :(得分:6)

您正在使用&#39; gcc&#39;编译C ++代码。 (为什么?),所以你需要链接到标准的c ++库。将-stdc++添加到构建命令。使用g ++进行编译时,它知道会自动链接到这个库。

  • 修改 另一方面,您的代码与C ++标准库没有任何关系。你有#include <iostream>,但你没有使用它。我认为(虽然没有检查),如果你注释掉这个包含,那么你的原始版本会使用&#39; gcc&#39;应该通过。

答案 1 :(得分:4)

你问为什么你的C ++程序无法用C编译器编译,但用C ++编译器正确编译?

然后这个修辞问题就是我的答案。

C编译器不会像在C ++运行时中那样进行链接。你需要那个运行时。链接器错误显示未链接C ++运行时。因为你正在使用C编译器。