Проблемы с компиляцией Makefile - PullRequest
0 голосов
/ 16 декабря 2011

Это мой make-файл

   FC=gfortran
CC=gcc 
CPC=g++ 
FFLAGS = -O3 
LINK=g++
BLASF=dgemmf.o dgemmkernel2.o mult.o
BLASFSRC=dgemmf.f
TIMER=mytimer.o

TGEMM=tgemm
ALL= $(TGEMM)

LIBS = -lblas 

all: $(ALL)
mult.o: 
    $(CPC) -O3 -fopenmp -c mult.cpp

$(TGEMM): tgemm.o mult.o $(TIMER) $(BLASF)
    $(FC) $(FFLAGS) -o $(TGEMM) tgemm.o $(TIMER) $(BLASF) $(LIBS)

dgemmkernel2.o: dgemmkernel2.cpp 
    $(CPC) -O3 -c -fopenmp dgemmkernel2.cpp 
tgemm.o: tgemm.f $(INCLUDE)
    $(FC) $(FFLAGS) -c tgemm.f

clean:
    rm -rf *.o $(ALL)

Это то, что я получаю за ошибки:

     make -f makefile_gcc2
gfortran -O3  -c tgemm.f
g++  -O3 -fopenmp -c mult.cpp
gcc     -c -o mytimer.o mytimer.c
gfortran -O3   -c -o dgemmf.o dgemmf.f
g++  -O3 -c -fopenmp dgemmkernel2.cpp 
gfortran -O3  -o tgemm tgemm.o mytimer.o dgemmf.o dgemmkernel2.o mult.o -lblas 
dgemmkernel2.o:(.eh_frame+0x12): undefined reference to `__gxx_personality_v0'
mult.o: In function `global constructors keyed to main':
mult.cpp:(.text+0x1a): undefined reference to `std::ios_base::Init::Init()'
mult.cpp:(.text+0x29): undefined reference to `std::ios_base::Init::~Init()'
mult.o: In function `_Z4multPdS_iS_iii.omp_fn.0':
mult.cpp:(.text+0x4f): undefined reference to `omp_get_num_threads'
mult.cpp:(.text+0x57): undefined reference to `omp_get_thread_num'
mult.o: In function `mult(double*, double*, int, double*, int, int, int)':
mult.cpp:(.text+0x175): undefined reference to `omp_get_num_threads'
mult.cpp:(.text+0x1b9): undefined reference to `GOMP_parallel_start'
mult.cpp:(.text+0x1c6): undefined reference to `GOMP_parallel_end'
mult.o:(.eh_frame+0x12): undefined reference to `__gxx_personality_v0'
collect2: ld returned 1 exit status
make: *** [tgemm] Error 1

Я понимаю из своего исследования, что это вероятные проблемы с компоновщиком, но я не могу сЖизнь меня понять, в чем проблема.Есть ли кто-нибудь, кто мог бы иметь некоторое представление о том, в чем проблема?

Ответы [ 2 ]

3 голосов
/ 16 декабря 2011

Если вы используете источники C ++, вам следует связываться с программой g ++ вместо gfortran.Противоположность верна с компиляторами Intel.

Итак, измените:

$(TGEMM): tgemm.o mult.o $(TIMER) $(BLASF)
    $(FC) $(FFLAGS) -o $(TGEMM) tgemm.o $(TIMER) $(BLASF) $(LIBS)

на

$(TGEMM): tgemm.o mult.o $(TIMER) $(BLASF)
    $(LINK) $(FFLAGS) -o $(TGEMM) tgemm.o $(TIMER) $(BLASF) $(LIBS)
1 голос
/ 07 октября 2012

У меня похожая проблема, и я решил ее, связавшись с файлом 'libgomp.dll.a' - я использую MinGW 4.4.Или вам просто нужно добавить в библиотеку ссылку на "-lgomp", например, LIBS + = -lgomp

...