質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.53%

  • C++

    4315questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

linker command fails with exit code 1 というエラーが消えない。(フレームワークの追加忘れ?)

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 835

waya

score 14

前提・実現したいこと

プログラミングコンテストチャレンジブックの幅優先探索のプログラムで詰まりました.
はじめに横幅、縦幅を入力し、そのあとにchar型で
'#':壁
'.':通路
'S':start
'G':goal
として道を入力し、スタートからゴールまでの最短経路を求める問題です。

linker command failed with exit code 1 (use -v to see invocation)


というエラーが消えず困惑しています。

発生している問題・エラーメッセージ

final section layout:
    __TEXT/__text addr=0x100001440, size=0x00005740, fileOffset=0x00001440, type=1
    __TEXT/__stubs addr=0x100006B80, size=0x00000066, fileOffset=0x00006B80, type=28
    __TEXT/__stub_helper addr=0x100006BE8, size=0x000000A6, fileOffset=0x00006BE8, type=32
    __TEXT/__gcc_except_tab addr=0x100006C90, size=0x000002B0, fileOffset=0x00006C90, type=0
    __TEXT/__unwind_info addr=0x100006F40, size=0x000000BC, fileOffset=0x00006F40, type=22
    __DATA/__nl_symbol_ptr addr=0x100007000, size=0x00000010, fileOffset=0x00007000, type=29
    __DATA/__got addr=0x100007010, size=0x00000020, fileOffset=0x00007010, type=29
    __DATA/__la_symbol_ptr addr=0x100007030, size=0x00000088, fileOffset=0x00007030, type=27
    __DATA/__data addr=0x1000070C0, size=0x00000020, fileOffset=0x000070C0, type=0
    __DATA/__common addr=0x1000070E0, size=0x00000020, fileOffset=0x00000000, type=25
    __DATA/__huge addr=0x100007100, size=0xBA44AB654, fileOffset=0x00000000, type=25
ld: 32-bit RIP relative reference out of range (10000221816 max is +/-4GB): from __Z10bfs_searchv (0x100001440) to _d (0x3540F6250) in '__Z10bfs_searchv' from /var/folders/1m/b52stqf54pggs6ng3z9xb8380000gn/T/bfs-c8955c.o for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

該当のソースコード

#define ffor(i,a,b) for (int i=(a);i<(b);i++)
#define rfor(i,a,b) for (int i=(b)-1;i>=(a);i--)
#define rep(i,n) for (int i=0;i<(n);i++)
#define rrep(i,n) for (int i=(n)-1;i>=0;i--)
#include<iostream>
#include<algorithm>
#include<cmath>
#include<string>
#include<stack>
#include<queue>
#include<utility>
#include<map>
#define SIZE 100001
#define MOD 1000000007
#define INF 100000000
using namespace std;

typedef pair<int,int> P;
char maze[SIZE][SIZE];
int N,M;
int sx,sy;
int gx,gy;
int d[SIZE][SIZE];

int dx[4] = {1,0,-1,0},dy[4] = {0,1,0,-1};

int bfs_search(){
    queue<P> que;
    //INFで初期化
    rep(i,N){
        rep(j,M){
            d[i][j] = INF;
        }
    }

    que.push(P(sx,sy));
    d[sx][sy] = 0;

    while(que.size()){
    //キューの先頭を取り出す
        P p = que.front();
        que.pop();
    //取り出してきた状態がゴールなら探索をやめる
        if(p.first == gx && p.second == gy) break;

    //移動四方向をループ
        rep(i,4){
            //移動後の点を(nx,ny)とする
            int nx = p.first + dx[i];
            int ny = p.second + dy[i];

            if(0 <= nx && nx <N && 0 <= ny && ny < M && maze[nx][ny] != '#' && d[nx][ny] == INF){
                //移動できるならキューに入れ、その点の距離をpからの距離+1で確定する
                que.push(P(nx,ny));
                d[nx][ny] = d[p.first][p.second] + 1;
            }
        }
    }
    return d[gx][gy];
}

void solve(){
    int res = bfs_search();
    cout << res << endl;
}

int main(){
    cin >> N >> M;
    rep(i,N){
        rep(j,M){
            cin >> maze[i][j];
        }
    }

    rep(i,N){
        rep(j,M){
            if(maze[i][j] == 'S'){
                sx = i;
                sy = j;
            }
            if(maze[i][j] == 'G'){
                gx = i;
                gy = j;
            }
        }
    }

    solve();

    return 0;
}

試したこと

フレームワークの追加忘れがあるときに生じるようですが、どのように対応して良いかわかりません。

補足情報(言語/FW/ツール等のバージョンなど)

環境はmacOSsierraです。
IDEとしてXcodeは使用せず、vimでプログラムを編集しながらg++でコンパイルして使用しています。
対策方法を教えていただけたら幸いです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

こんにちは。

何故か、macのclangは、マングルされたままエラーメッセージが出るようですね。

ld: 32-bit RIP relative reference out of range (10000221816 max is +/-4GB): from Z10bfs_searchv (0x100001440) to _d (0x3540F6250) in 'Z10bfs_searchv' from /var/folders/1m/b52stqf54pggs6ng3z9xb8380000gn/T/bfs-c8955c.o for architecture x86_64

を見ると、恐らく、bfs_search(__Z10bfs_searchv)関数の中で、d(_d)で範囲外が発生しているというメッセージのようです。

int d[100001][100001];のサイズは4GBytesを超えるため、32ビット・コンバイルではアクセスできません。SIZEを23170まで小さくすれば、恐らく通ると思います。(もしかするともう少し大きくてもOKかも。)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/26 17:58

    非常にわかりやすい回答ありがとうございます。
    プログラムもうまく動作しました。
    Chironianさんのおかげでエラーの意味をやっと理解できました。
    まだC++でプログラムを書き始めたばかりなので仕組みの理解も深めていきたいと思います。

    キャンセル

  • 2017/02/26 18:13

    大抵のコンパイラは__Z10bfs_searchvのような分かり難い出力だけではなく、きちんと読める関数名も出力されます。

    何故かmacのclangはこのようになるようです。そのようなコンパイラは始めてみました。
    恐らく何かオプションを付けることで適切な表示になるとは思うのですか、私は把握していません。
    https://teratail.com/questions/67210 で質問された方も同じ問題にハマっているようです。
    (マングルの話を上記質問への回答のコメントで軽くしてますので、参考にされて下さい。)
    clangに詳しい人が来てくれればよいのですが。

    キャンセル

同じタグがついた質問を見る

  • C++

    4315questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • トップ
  • C++に関する質問
  • linker command fails with exit code 1 というエラーが消えない。(フレームワークの追加忘れ?)