2017-09-18 1 views
-1

私はMacBook Pro(13-inch、Mid 2012)でMontecarloシミュレーションでgsl_rng.hを実装しようとしています。シミュレーションはすべてC言語で書かれています。私の問題は、gcc-6はコンパイルフラグにもかかわらずgslライブラリを見つけることができないと言うことです。Macでgslでコンパイルできない

すべての.cファイルに含まれているdeclare.hのトップは、私が働いている:

/* __________________ LIBRARIES ___________________*/ 
#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
#include <time.h> 
#include <gsl/gsl_rng.h> 

エラー:私のメイクファイルに含ま

fatal error: gsl/gsl_rng.h: No such file or directory 

コンパイルフラグを:

INCLUDE = -I/usr/local/Cellar/gsl/2.4/include 
LINK = -L/usr/local/Cellar/gsl/2.4/lib -lgsl -lgslcblas 

gcc-6とgslの両方をHomebrew経由でインストールしました。

gcc-6でgslを見つける方法を教えてください。私の旗は間違っている?

メイク:

CC = g++-6 

CFLAGS = -lm -O3 -ansi -pedantic -Wall -Wextra\ 
     -Wconversion -Wredundant-decls -fmax-errors=7\ 
     -Wunsafe-loop-optimizations -Wmissing-braces\ 
     -Wparentheses 
     # -Wdouble-promotion 

INCLUDE = -I/usr/local/Cellar/gsl/2.4/include 

LINK = -L/usr/local/Cellar/gsl/2.4/lib -lgsl -lgslcblas 

../bin/bidimensional_MC: random.o functions.o subroutines.o\ 
      main.o 
$(CC) -o ../bin/bidimensional_MC random.o functions.o\ 
     subroutines.o main.o $(CFLAGS) $(LINK) $(INLCUDE) 

random.o: random.c 
    $(CC) -c random.c -lm -O3 $(CFLAGS) $(INCLUDE) 

functions.o: functions.c 
    $(CC) -c functions.c $(CFLAGS) $(INCLUDE) 

main.o: main.c 
    $(CC) -c main.c $(CFLAGS) $(INCLUDE) 

suboutines.o: subroutines.c 
    $(CC) -c subroutines.c $(CFLAGS) $(INCLUDE) 

clean: 
    rm *.o 

ls /usr/local/Cellar/gsl/2.4/include/gsl/の出力は次のとおりです。

/usr/local/Cellar/gsl/2.4/include/gsl/gsl_rng.h 

ls /usr/local/Cellar/gsl/2.4/include/の出力は次のようになります。

gsl/ 

ls /usr/local/Cellar/gsl/2.4/include/gsl/の出力が投稿には長すぎます、しかし、すべてがそこにあるはずです。

追加情報: 私は最終的にシミュレーションを実行するクラスタにコードがC++に準拠している必要があるため、gcc-6の代わりにg ++ - 6を使用しています。 makefileで

+2

は '/ usr/local/Cellar/gsl/2.4'です。インクルードパスとlibパスは有効ですか? –

+1

'ls /usr/local/Cellar/gsl/2.4/include/gsl/gsl_rng.h /usr/local/Cellar/gsl/2.4/include/gsl//usr/local/Cellar/gsl/2.4/include/'? –

+0

@RetiredNinja これらはすべてが保存されている絶対パスです。 '/ usr/local/include'のようなものは期待していますが、これまでに書いたパスへのシンボリックリンクしか含まれていないかもしれません。 –

答えて

1

、あなたが持っている(または、より正確には、一度に持っていると主張):

random.o: random.c 
    $(CC) -c random.c -lm -O3 $(CFLAGS) 

オブジェクトファイルをコンパイルするときには、ライブラリを指定しないでください。 CFLAGSには${INCLUDE}(または$(INCLUDE))マクロは含まれていません。

random.o: random.c 
    $(CC) -c random.c -O3 $(CFLAGS) $(INCLUDE) 

これは最小限の変更です。私は$(INCLUDE)CFLAGSに追加します(また、-lmを削除します。特に問題はありませんが、Macではその必要はありません)。また-Werror -Wmissing-prototypes -Wstrict-prototypesを追加し、-ansi(別名-std=c90)を使用することは賢明ではありません - 古風な標準です。 -std=c11を使用してください。

CFLAGS = -O3 -g -std=c11 -pedantic -Wall -Wextra \ 
     -Wconversion -Wredundant-decls -fmax-errors=7 \ 
     -Wunsafe-loop-optimizations -Wmissing-braces \ 
     -Wparentheses $(INCLUDE) \ 
     -Werror -Wmissing-prototypes -Wstrict-prototypes 

さらに、-gを追加してデバッグコードを取得しました。最適化を行っても、常に-gが含まれます。ランタイムコストはありません。コードをデバッグする必要がある場合には利点があります。確かに、最適化されたコードをデバッグするのは簡単ではありませんが、-gがない場合よりも多くのことができます。それを 'オブジェクトへのコンパイル'と 'リンク'の両方のフェーズに含めます。

(詳細には、CFLAGS全体を書き直すのではなく、各フラグを個別にオンまたはオフにできるように、別々のマクロを用意しています。しかし、それは別の日を待つことができます。)

+0

なぜ 'ansi' ?! '-std = c11'または少なくとも99をお勧めします、このプログラムはMac上で動作します;) –

+0

@JonathanLefflerありがとうございました。 –

+0

私はより適切なコンパイルフラグで答えを更新しました。私は '-We parentheses'や' -Wmissing-braces'を使うとは思っていません。デフォルトでは使用しません。残りは私の心配を引き起こさない。 –

関連する問題