2015-09-18 104 views
-2

我正在嘗試使用gsl庫進行一些隨機數生成。我有以下生成文件GSL中未定義的引用,可能的鏈接錯誤?

CC = g++ 
#CFLAGS = -Wall -O2 
CFLAGS = -g -Wall 
LDFLAGS = -Lgsl/lib -lgsl -lgslcblas -lm 
INCLDIRS = -Igsl/include 

RAND_TARGET = rand 
HM_TARGET = hitormiss 
NU_TARGET = nonuniform 
MC1D_TARGET = mc1d 

RAND_SRCS = rand.cc generators.cc EX_RNGs.cc LC_RNGs.cc util.cc RNG_factory.cc 
HM_SRCS = hitormiss.cc generators.cc EX_RNGs.cc LC_RNGs.cc discrep.cc util.cc sphere.cc 
NU_SRCS = nonuniform.cc generators.cc LC_RNGs.cc EX_RNGs.cc util.cc 
MC1D_SRCS = mc1d.cc generators.cc LC_RNGs.cc 

RAND_OBJS = ${RAND_SRCS:.cc=.o} 
HM_OBJS = ${HM_SRCS:.cc=.o} 
NU_OBJS = ${NU_SRCS:.cc=.o} 
MC1D_OBJS = ${MC1D_SRCS:.cc=.o} 

CLEANFILES = $(RAND_OBJS) $(RAND_TARGET) \ 
     $(HM_OBJS) $(HM_TARGET) \ 
     $(NU_OBJS) $(NU_TARGET) \ 
     $(MC1D_OBJS) $(MC1D_TARGET) \ 
     core 

VERYCLEANFILES = randdata.txt \ 
      randdata.bin \ 
      randdata2d.txt \ 
      accepts.txt \ 
      rejects.txt \ 
      nonuniformdata.txt \ 
      ${wildcard hom_*_*d_*.txt} \ 
      ${wildcard points_*_*d_*.txt} 

all: $(RAND_TARGET) $(HM_TARGET) $(NU_TARGET) $(MC1D_TARGET) 

release: 
    (make CFLAGS="-Wall -O2" all;) 

$(RAND_TARGET): $(RAND_OBJS) 
    $(CC) $(CFLAGS) $(LDFLAGS) -o [email protected] $^ $(INCLDIRS) 

$(HM_TARGET): $(HM_OBJS) 
    $(CC) $(CFLAGS) $(LDFLAGS) -o [email protected] $^ $(INCLDIRS) 

$(NU_TARGET): $(NU_OBJS) 
    $(CC) $(CFLAGS) $(LDFLAGS) -o [email protected] $^ $(INCLDIRS) 

$(MC1D_TARGET): $(MC1D_OBJS) 
    $(CC) $(CFLAGS) $(LDFLAGS) -o [email protected] $^ $(INCLDIRS) 

%.o: %.cc 
    $(CC) $(CFLAGS) $(INCLDIRS) -c $< 

clean: 
    rm -f $(CLEANFILES) 

veryclean: clean 
    rm -f $(VERYCLEANFILES) 

LC_RNGs.o: generators.h LC_RNGs.h 
EX_RNGs.o: generators.h EX_RNGs.h 
discrep.o: generators.h discrep.h 
RNG_factory.o: generators.h LC_RNGs.h EX_RNGs.h 
util.o: util.h 
sphere.o: sphere.h 
rand.o: generators.h LC_RNGs.h EX_RNGs.h util.h RNG_factory.h 
hitormiss.o: generators.h LC_RNGs.h EX_RNGs.h discrep.h util.h sphere.h 
mc1d.o: generators.h LC_RNGs.h 

和下面的頭文件

#ifndef _H_EX_RNGS 
#define _H_EX_RNGS 

#include <cstdlib> 
#include <cmath> 
#include <iostream> 
#include "generators.h" 
#include "gsl/include/gsl/gsl_rng.h" 

namespace generators { 

    class GSL_RAND: public RNG { 
     gsl_rng *r; 
    public: 
     GSL_RAND(); 

     virtual unsigned int nextInt(); 

     /** Base deconstructor. */ 
     virtual ~GSL_RAND() {} 

     virtual void setSeed(unsigned int seed); 

     virtual unsigned int getMaximum(); 
    }; 

}; 

#endif 

運行生成文件時,我爲每一個呼叫到GSL功能的問題是

EX_RNGs.o: In function `generators::GSL_RAND::GSL_RAND()': 
/home/school/rngmc/EX_RNGs.cc:34: undefined reference to `gsl_rng_rand' 
/home/school/rngmc/EX_RNGs.cc:34: undefined reference to `gsl_rng_alloc' 

和類似的錯誤在節目中。從我讀過的內容來看,未定義的引用錯誤通常是由於鏈接到必要文件時出錯造成的。地圖gsl(我鏈接到makefile中)和makefile在同一張地圖上,所以這應該沒問題吧?我看不出我犯了什麼錯誤?預先感謝您的幫助。

編輯:我不知道這是否會有所幫助,但

LDFLAGS = -L/usr/local/lib -lgsl -lgslcblas -lm 
INCLDIRS = -I/usr/local/include 

中生成文件LDFLAGS和INCLDIRS線更換也給出了同樣的錯誤,即使GSL庫還存在於USR /本地目錄。

+0

我是否需要爲我的文章添加額外信息?或者這種類型的問題是不允許的? – user47693

回答

1

你的問題很常見。這:

$(CC) $(CFLAGS) $(LDFLAGS) -o [email protected] $^ $(INCLDIRS) 

應該是這樣的:

$(CC) $(CFLAGS) $(INCLDIRS) -o [email protected] $^ $(LDFLAGS) 

鏈接庫(-l標誌)應該(在你的情況$^)在命令行源文件。

+0

謝謝,現在一切正常。 – user47693

相關問題