2011-11-11 31 views
2

私は現在Macでローカルに編集しているが、Ubuntuサーバー上で動作するC++に取り組んでいます。私は常にコードを自分のMac上でコンパイルしてサーバにアップロードしてからコンパイルするようにしています。そこでmakefileを使って自分のローカルディレクトリにインストールされているライブラリとリンクする必要があります。基本的には、コードのかなりの部分を編集して、自分のMacでコンパイルしてコンパイルするためにサーバーにアップロードしましたが、コンパイルされませんでした。幸いにも、私はコードのバックアップバージョンを持っていたので、私はサーバー上でそれを試みました、そして、それはもはやコンパイルされません!前回私のコードがサーバー上でコンパイルされていることが分かっていた今、私は彼らがいくつかの更新プログラムを実行したことを知っています。プログラムはもうコンパイルされません

LOCAL_INCLUDE = /home/schraiber/.local/include 
LOCAL_LIB = /home/schraiber/.local/lib 
CXXFLAGS = -I$(LOCAL_INCLUDE) 
CXX_LDFLAGS = -L$(LOCAL_LIB) -lgsl -lm -lgslcblas -lpthread 

CoalHMMgf: main.o IOUtilities.o parameters.o Algorithms.o Optimization.o probabilities.o RNGUtilities.o Data.o ThreadData.h 
     g++ $(CXXFLAGS) $(CXX_LDFLAGS) main.o IOUtilities.o parameters.o Algorithms.o Optimization.o probabilities.o RNGUtilities.o Data.o -o CoalHMMgf 
main.o: main.cpp IOUtilities.h parameters.h Algorithms.h Optimization.h probabilities.h ThreadData.h Data.h 
     g++ $(CXXFLAGS) $(CXX_LDFLAGS) -c main.cpp 
IOutilities.o: IOUtilities.h IOUtilities.cpp parameters.h data.h 
     g++ $(CXXFLAGS) $(CXX_LDFLAGS) -c IOUtilities.cpp 
parameters.o: parameters.h parameters.cpp 
     g++ $(CXXFLAGS) $(CXX_LDFLAGS) -c parameters.cpp 
Algorithms.o: Algorithms.h Algorithms.cpp 
     g++ $(CXXFLAGS) $(CXX_LDFLAGS) -c Algorithms.cpp 
Optimization.o: Optimization.h Optimization.cpp Algorithms.h parameters.h probabilities.h RNGUtilities.h ThreadData.h IOUtilities.h 
     g++ $(CXXFLAGS) $(CXX_LDFLAGS) -c Optimization.cpp 
probabilities.o: probabilities.h probabilities.cpp parameters.h 
     g++ $(CXXFLAGS) $(CXX_LDFLAGS) -c probabilities.cpp 
RNGUtilities.o: RNGUtilities.h RNGUtilities.cpp 
     g++ $(CXXFLAGS) $(CXX_LDFLAGS) -c RNGUtilities.cpp 
Data.o: Data.h Data.cpp 
     g++ $(CXXFLAGS) $(CXX_LDFLAGS) -c Data.cpp 

とエラー:参考のために、ここに私のメイクファイルです

g++ -I/home/schraiber/.local/include -L/home/schraiber/.local/lib -lgsl -lm -lgslcblas -lpthread main.o IOUtilities.o parameters.o Algorithms.o Optimization.o probabilities.o RNGUtilities.o Data.o -o CoalHMMgf 
main.o: In function `main': 
main.cpp:(.text+0xbf1): undefined reference to `pthread_create' 
main.cpp:(.text+0xd0e): undefined reference to `pthread_join' 
Optimization.o: In function `my_df(gsl_vector const*, void*, gsl_vector*)': 
Optimization.cpp:(.text+0x3149): undefined reference to `gsl_vector_alloc' 
Optimization.cpp:(.text+0x316b): undefined reference to `gsl_vector_get' 
Optimization.cpp:(.text+0x3180): undefined reference to `gsl_vector_set' 
Optimization.cpp:(.text+0x31bc): undefined reference to `gsl_vector_get' 
Optimization.cpp:(.text+0x31ec): undefined reference to `gsl_vector_set' 
Optimization.cpp:(.text+0x323b): undefined reference to `gsl_vector_set' 
Optimization.cpp:(.text+0x327e): undefined reference to `gsl_vector_set' 
Optimization.cpp:(.text+0x32c9): undefined reference to `gsl_vector_set' 
Optimization.o: In function `MHthreaded(void*)': 
Optimization.cpp:(.text+0x3489): undefined reference to `gsl_rng_env_setup' 
Optimization.cpp:(.text+0x3490): undefined reference to `gsl_rng_default' 
Optimization.cpp:(.text+0x360b): undefined reference to `gsl_rng_uniform' 
Optimization.cpp:(.text+0x3653): undefined reference to `gsl_ran_gaussian' 
Optimization.cpp:(.text+0x3686): undefined reference to `gsl_ran_gaussian' 
Optimization.cpp:(.text+0x377f): undefined reference to `gsl_rng_uniform' 
RNGUtilities.o: In function `AllocRNG(gsl_rng*&, gsl_rng_type const*, int)': 
RNGUtilities.cpp:(.text+0x9a): undefined reference to `gsl_rng_alloc' 
RNGUtilities.cpp:(.text+0xba): undefined reference to `gsl_rng_set' 
RNGUtilities.o: In function `FreeRNG(gsl_rng*&)': 
RNGUtilities.cpp:(.text+0xe3): undefined reference to `gsl_rng_free' 
collect2: ld returned 1 exit status 
make: *** [CoalHMMgf] Error 1 

と、ちょうどそのGSLは、ローカルディレクトリにインストールされていることを確認する:

[email protected]:~/test_rsync$ ls ~/.local/lib 
libbpp-core.a  libbpp-core.so.2.0.0 libbpp-seq.so.9  libgslcblas.a libgslcblas.so.0  libgsl.so   pkgconfig 
libbpp-core.so libbpp-seq.a   libbpp-seq.so.9.1.0 libgslcblas.la libgslcblas.so.0.0.0 libgsl.so.0  python2.7 
libbpp-core.so.2 libbpp-seq.so   libgsl.a    libgslcblas.so libgsl.la    libgsl.so.0.16.0 
[email protected]:~/test_rsync$ ls ~/.local/include/ 
Bpp gsl 

面白いことに私のプログラムはBppとリンクすることになっていることに注意してください。

+0

どのライブラリファイルに 'gsl_vector'が含まれていますか? –

+0

私はそれがlibgsl.aにあると信じています。 –

答えて

5

"-lfoo"パラメータは、 "g ++"コマンドラインで最後に指定する必要があります。たとえば、メイクファイルにこの変更を加えます:

CoalHMMgf: main.o IOUtilities.o parameters.o Algorithms.o Optimization.o probabilities.o RNGUtilities.o Data.o ThreadData.h 
     g++ $(CXXFLAGS) main.o IOUtilities.o parameters.o Algorithms.o Optimization.o probabilities.o RNGUtilities.o Data.o -o CoalHMMgf $(CXX_LDFLAGS) 
+0

うわー、それはうまくいきました!間違った構文をしているにもかかわらず、なぜそれが以前にコンパイルされたのだろうかと疑問に思っていますか?宇宙の謎。 –

0

ライブラリは、他の参照を含まないライブラリが最後のものになるようにリンク行に定義する必要があります。第2のライブラリのコードに依存するライブラリを最初にリストする必要があります。 .oファイルの後ろにリストする必要があります。そうでなければ.oファイルは自己完結型であるとみなされ、ライブラリは必要ありません。

+0

いいえ、それはうまくいきませんでした:(。また、なぜこれが問題だったのか、前にコンパイルされたのでしょうか(1週間前、この全く同じことはサーバー上でうまくコンパイルされます)? –

+0

Updated ... .oファイルは-lフラグの前にある必要があります。pthreadエラーは、最初に私の目をとらえていたはずです。順序が間違っているという確かな指摘でした。 –

関連する問題