2015-09-18 108 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

相关问题