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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C++

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

Q&A

解決済

1回答

7490閲覧

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

waya

総合スコア20

C++

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

0グッド

0クリップ

投稿2017/02/26 02:48

###前提・実現したいこと
プログラミングコンテストチャレンジブックの幅優先探索のプログラムで詰まりました.
はじめに横幅、縦幅を入力し、そのあとに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)

###該当のソースコード

c++

1#define ffor(i,a,b) for (int i=(a);i<(b);i++) 2#define rfor(i,a,b) for (int i=(b)-1;i>=(a);i--) 3#define rep(i,n) for (int i=0;i<(n);i++) 4#define rrep(i,n) for (int i=(n)-1;i>=0;i--) 5#include<iostream> 6#include<algorithm> 7#include<cmath> 8#include<string> 9#include<stack> 10#include<queue> 11#include<utility> 12#include<map> 13#define SIZE 100001 14#define MOD 1000000007 15#define INF 100000000 16using namespace std; 17 18typedef pair<int,int> P; 19char maze[SIZE][SIZE]; 20int N,M; 21int sx,sy; 22int gx,gy; 23int d[SIZE][SIZE]; 24 25int dx[4] = {1,0,-1,0},dy[4] = {0,1,0,-1}; 26 27int bfs_search(){ 28 queue<P> que; 29 //INFで初期化 30 rep(i,N){ 31 rep(j,M){ 32 d[i][j] = INF; 33 } 34 } 35 36 que.push(P(sx,sy)); 37 d[sx][sy] = 0; 38 39 while(que.size()){ 40 //キューの先頭を取り出す 41 P p = que.front(); 42 que.pop(); 43 //取り出してきた状態がゴールなら探索をやめる 44 if(p.first == gx && p.second == gy) break; 45 46 //移動四方向をループ 47 rep(i,4){ 48 //移動後の点を(nx,ny)とする 49 int nx = p.first + dx[i]; 50 int ny = p.second + dy[i]; 51 52 if(0 <= nx && nx <N && 0 <= ny && ny < M && maze[nx][ny] != '#' && d[nx][ny] == INF){ 53 //移動できるならキューに入れ、その点の距離をpからの距離+1で確定する 54 que.push(P(nx,ny)); 55 d[nx][ny] = d[p.first][p.second] + 1; 56 } 57 } 58 } 59 return d[gx][gy]; 60} 61 62void solve(){ 63 int res = bfs_search(); 64 cout << res << endl; 65} 66 67int main(){ 68 cin >> N >> M; 69 rep(i,N){ 70 rep(j,M){ 71 cin >> maze[i][j]; 72 } 73 } 74 75 rep(i,N){ 76 rep(j,M){ 77 if(maze[i][j] == 'S'){ 78 sx = i; 79 sy = j; 80 } 81 if(maze[i][j] == 'G'){ 82 gx = i; 83 gy = j; 84 } 85 } 86 } 87 88 solve(); 89 90 return 0; 91} 92

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

###補足情報(言語/FW/ツール等のバージョンなど)
環境はmacOSsierraです。
IDEとしてXcodeは使用せず、vimでプログラムを編集しながらg++でコンパイルして使用しています。
対策方法を教えていただけたら幸いです。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんにちは。

何故か、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 03:28

編集2017/02/26 03:29
Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

waya

2017/02/26 08:58

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

2017/02/26 09:13

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問