2015-09-18 5 views
-2

Я пытаюсь использовать библиотеку gsl для генерации случайных чисел. У меня есть следующие MakefileНеопределенная ссылка в 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 

Проблемы, которые я получаю при запуске файла сборки

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 в программе. Из того, что я прочитал, неопределенные ссылочные ошибки обычно вызваны ошибками при связывании с необходимыми файлами. Карта gsl (с которой я ссылаюсь в make-файле) находится на той же карте, что и make-файл, так что это должно быть хорошо? Я не вижу, где я ошибся? Заранее благодарю за любую помощь.

EDIT: Я не знаю, если это помогает, но заменяя линии LDFLAGS и INCLDIRS в Makefile по

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

также дает ту же ошибку, даже если библиотека GSL также существуют в ЕГР/локальный каталог.

+0

Нужно ли добавлять дополнительную информацию к моему сообщению? Или этот вопрос не допускается? – user47693

ответ

1

Ваша проблема довольно распространена. Это:

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

Должно быть так:

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

Связанных библиотеки (-l флагов) должны идти после исходных файлов (в вашем случае $^) в командной строке.

+0

Спасибо, все работает сейчас. – user47693

Смежные вопросы