2011-11-11 137 views
2

我目前正在研究C++,我在Mac上本地編輯,但在Ubuntu服務器上運行。我總是確保代碼在上傳到服務器之前在我的mac上編譯,然後在那裏編譯它,我必須使用makefile來鏈接安裝在本地目錄中的庫。基本上,我編輯了我的代碼的很大一部分,發現它編譯在我的mac上,並將它上傳到服務器進行編譯,但它不能編譯!幸運的是,我有一個備份版本的代碼,所以我在服務器上試過,並且不再編譯!在最後一次,我知道我的代碼在服務器上編譯,現在,我知道他們運行了一些更新,但這就是我所能想到的,這是不同的。作爲參考,這是我的make文件:程序不會再編譯

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 ++」命令行中最後一個。因此,例如,在makefile中進行此更改:

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

庫必須在鏈接行上定義,以便不包含其他引用的庫是最後一個。依賴於第二個庫中代碼的庫需要首先列出。它們必須在.o文件之後列出,否則假定.o文件是自包含的,並且不需要這些庫。

+0

沒有,沒有工作:(還有,爲什麼它會編譯之前,如果這是問題(如在一週前,這完全相同的東西會編譯得很好在服務器上)? –

+0

更新中...... .o文件需要放在-l標誌之前,第一次出現pthread錯誤應該引起我的注意,因爲這肯定表明排序是錯誤的,因爲它不應該是一個缺少的參考,因爲它是獨立的 –