2011-11-11 6 views
2

저는 현재 Mac에서 로컬로 편집하지만 우분투 서버에서 실행되는 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 ++"명령 줄에서 마지막에 와야합니다. 예를 들어, 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

Updated ... .o 파일은 -l 플래그 앞에 있어야합니다. pthread 오류는 처음에는 내 눈을 사로 잡았을 것입니다. 순서가 잘못되었다는 확실한 표시 였으므로, 그것은 독립 적이기 때문에 절대로 누락 된 참조가되어서는 안됩니다. –

관련 문제