C++: включая библиотеки, несколько определений (ARPACK++)


В настоящее время я пытаюсь работать с другими библиотеками C++, такими как ARPACK++, и у меня возникли проблемы с несколькими определениями в папке include ARPACK++.
Это моя строка компиляции, которая включает несколько библиотек, которые мне нужны:

 g++ -g -Dlinux -I/home/LapEVSol/arpack++/include -I/usr/local/include/g++-3 -o main main.cc Basis.cc IntegrationRule.cc Matrix.cc Mesh.cc PDE.cc /home/LapEVSol/arpack++/libsuperlu_4.3.a  /home/LapEVSol/arpack++/libarpack.a /home/LapEVSol/arpack++/liblapack.a /home/LapEVSol/arpack++/librefblas.a /home/LapEVSol/arpack++/libgfortran.a  -lm

И компилятор выдает мне эту ошибку:

Matrix.cc: In member function ‘ARluSymMatrix<double>* CSCMatrix::CreateARluSymMatrix()’:
Matrix.cc:338:25: warning: address of local variable ‘MatrixName’ returned [-Wreturn-local-addr]
ARluSymMatrix<double> MatrixName(rows, nnz, entries, rowIndex, colPointer, 'L');
                     ^
/tmp/ccb6n5wo.o: In function `void std::_Destroy_aux<true>::__destroy<int*>(int*, int*)':
/home/LapEVSol/arpack++/include/arerror.h:163: multiple definition of `ArpackError::Set(ArpackError::ErrorCode, std::string const&)'
/tmp/ccR5YW3o.o:/home/LapEVSol/arpack++/include/arerror.h:163: first defined here
/tmp/ccb6n5wo.o: In function `void std::_Destroy_aux<true>::__destroy<int*>(int*, int*)':
/home/LapEVSol/arpack++/include/arerror.h:163: multiple definition of `ArpackError::code'
/tmp/ccR5YW3o.o:/home/LapEVSol/arpack++/include/arerror.h:163: first defined here
/tmp/ccpDlwxP.o: In function `__gnu_cxx::new_allocator<Mesh::Node>::new_allocator()':
/home/LapEVSol/arpack++/include/arerror.h:163: multiple definition of `ArpackError::Set(ArpackError::ErrorCode, std::string const&)'
/tmp/ccR5YW3o.o:/home/LapEVSol/arpack++/include/arerror.h:163: first defined here
/tmp/ccpDlwxP.o: In function `__gnu_cxx::new_allocator<Mesh::Node>::new_allocator()':
/home/LapEVSol/arpack++/include/arerror.h:163: multiple definition of `ArpackError::code'
/tmp/ccR5YW3o.o:/home/LapEVSol/arpack++/include/arerror.h:163: first defined here
collect2: error: ld returned 1 exit status
make: *** [all] Error 1

Это немного странно, так как включаемый заголовок "arerrorh.h" заключен внутри правильного:

 #ifndef ARERROR_H
 #define ARERROR_H
 ...
 #endif

Может быть, я делаю что-то неправильно в части компоновки или компиляции? Потому что это та часть, в которой я меньше всего уверен. Я был бы рад, если бы кто-нибудь мог сказать мне, что я делаю неправильно здесь.
Заранее спасибо!


person Log7    schedule 13.08.2014    source источник
comment
Сейчас я бы больше беспокоился о warning: address of local variable ‘MatrixName’ returned. Да, множественное определение находится во время компоновки, поэтому определение защиты не поможет вам в этом.   -  person pqnet    schedule 14.08.2014


Ответы (1)


В заголовке arerror.h есть ошибка. Поместите inline в определение функции ArpackError::Set. Кроме того, пожалуйста, исправьте метод CSCMatrix::CreateARluSymMatrix, который возвращает адрес локальной переменной.

person pqnet    schedule 13.08.2014
comment
Я исправил эту часть. Теперь ошибка немного короче, но все же есть: /tmp/ccOcpFbY.o: In function __gnu_cxx::new_allocator<Mesh::Node>::new_allocator()': /home/LapEVSol/arpack++/include/arrseig.h:33: multiple definition of ArpackError::code' - person Log7; 14.08.2014
comment
@ Log7 какую часть ты исправил? Я предложил 2 исправления, одно для ошибки и одно для предупреждения - person pqnet; 14.08.2014
comment
@ Log7 определение ArpackError::code должно быть в файле .cpp, а не в заголовке. Сделайте для него файл .cpp и поместите его туда. - person pqnet; 14.08.2014