Ошибка компоновщика C++: неопределенные ссылки только при оптимизированной сборке
Я получаю неопределенную ошибку компоновщика ссылок только при связывании файлов оптимизированных объектов, а не при связывании неоптимизированных объектных файлов. Я не понимаю, в чем проблема или может быть.
Вот моя неоптимизированная сборка:
Строительный файл: ../COMPASS.cpp Вызов: компилятор GCC C++ g++ -O0 -g3 -pg -Wall -c -fmessage-length=0 -Wno-sign-сравнить -fopenmp -MMD -MP -MF"COMPASS.d" -MT"COMPASS.d" -o"COMPASS.o" "../COMPASS.cpp" Готовое здание: ../COMPASS.cpp Строительный файл: ../PSA.cpp Вызов: компилятор GCC C++ g++ -O0 -g3 -pg -Wall -c -fmessage-length=0 -Wno-sign-сравнить -fopenmp -MMD -MP -MF"PSA.d" -MT"PSA.d" -o"PSA.o" "../PSA.cpp" Готовое здание: ../PSA.cpp Строительный файл: ../SAR.cpp Вызов: компилятор GCC C++ g++ -O0 -g3 -pg -Wall -c -fmessage-length=0 -Wno-sign-сравнить -fopenmp -MMD -MP -MF"SAR.d" -MT"SAR.d" -o"SAR.o" "../SAR.cpp" Готовое здание: ../SAR.cpp Строительный файл:../constraints.cpp Вызов: компилятор GCC C++ g++ -O0 -g3 -pg -Wall -c -fmessage-length=0 -Wno-sign-сравнить -fopenmp -MMD -MP -MF"constraints.d" -MT"constraints.d" -o"constraints.o" "../constraints.cpp" Готовое здание:../constraints.cpp Строительный файл:../genetic.cpp Вызов: компилятор GCC C++ g++ -O0 -g3 -pg -Wall -c -fmessage-length=0 -Wno-sign-сравнить -fopenmp -MMD -MP -MF "генетический.d" -MT "генетический.d" -o "генетический.o" "../genetic.cpp" Готовое здание:../genetic.cpp Строительный файл:../globals.cpp Вызов: компилятор GCC C++ g++ -O0 -g3 -pg -Wall -c -fmessage-length=0 -Wno-sign-сравнить -fopenmp -MMD -MP -MF"globals.d" -MT"globals.d" -o"globals.o" "../globals.cpp" Готовое здание:../globals.cpp Строительный файл:../logging.cpp Вызов: компилятор GCC C++ g++ -O0 -g3 -pg -Wall -c -fmessage-length=0 -Wno-sign-сравнить -fopenmp -MMD -MP -MF"logging.d" -MT"logging.d" -o"logging.o" "../logging.cpp" Готовое здание:../logging.cpp Строительный файл:../main.cpp Вызов: компилятор GCC C++ g++ -O0 -g3 -pg -Wall -c -fmessage-length=0 -Wno-sign-сравнить -fopenmp -MMD -MP -MF"main.d" -MT"main.d" -o"main.o" "../main.cpp" Готовое здание:../main.cpp Строительный файл:../sampling.cpp Вызов: компилятор GCC C++ g++ -O0 -g3 -pg -Wall -c -fmessage-length=0 -Wno-sign-сравнить -fopenmp -MMD -MP -MF"sampling.d" -MT"sampling.d" -o"sampling.o" "../sampling.cpp" Готовое здание:../sampling.cpp Строительный файл: ../simulation1.cpp Вызов: компилятор GCC C++ g++ -O0 -g3 -pg -Wall -c -fmessage-length=0 -Wno-sign-сравнить -fopenmp -MMD -MP -MF "Simulation1.D" -MT "моделирование1.d" -o"моделирование1.o" "../simulation1.cpp" ../globals.h: в глобальном масштабе: ../globals.h:43: предупреждение: встроенная функция 'double showDecimals(const double&, const int&)' используется, но никогда не определяется Готовое здание: ../simulation1.cpp Строительный файл: ../test_function.cpp Вызов: компилятор GCC C++ g++ -O0 -g3 -pg -Wall -c -fmessage-length=0 -Wno-sign-сравнить -fopenmp -MMD -MP -MF"test_function.d" -MT"test_function.d" -o"test_function.o" "../test_function.cpp" Готовое здание: ../test_function.cpp Построение цели: pc2 Вызов: GCC C++ Linker g++ -pg -fopenmp -pg -o"pc2" ./COMPASS.o ./PSA.o ./SAR.o ./constraints.o ./genetic.o ./globals.o ./logging.o ./main.o ./sampling.o ./simulation1.o ./test_function.o Готовая строительная цель: pc2
Вот моя оптимизированная сборка:
Файл сборки: ../COMPASS.cpp Вызов: компилятор GCC C++ g++ -O3 -Wall -c -fmessage-length=0 -Wno-sign-сравнить -fopenmp -MMD -MP -MF "COMPASS.d" -MT "COMPASS.d "-o" COMPASS.o ""../COMPASS.cpp "Завершено построение: ../COMPASS.cpp Файл сборки: ../PSA.cpp Вызов: компилятор GCC C++ g ++ -O3 -Wall -c -fmessage -length = 0 -Wno-sign-сравнить -fopenmp -MMD -MP -MF"PSA.d" -MT"PSA.d" -o"PSA.o" "../PSA.cpp" Законченное строительство:.. /PSA.cpp Файл сборки: ../SAR.cpp Вызов: компилятор GCC C++ g++ -O3 -Wall -c -fmessage-length=0 -Wno-sign-сравнить -fopenmp -MMD -MP -MF"SAR.d" -MT"SAR.d" -o"SAR.o" "../SAR.cpp" Завершено построение: ../SAR.cpp Файл сборки:../constraints.cpp Вызов: GCC C++ Компилятор g ++ -O3 -Wall -c -fmessage-length = 0 -Нет-подписать-сравнить -fopenmp -MMD -MP -MF"constraints.d" -MT"constraints.d" -o"constraints.o" "../constraints.cpp" Завершено building: ../constraints.cpp Файл сборки:../genetic.cpp Вызов: компилятор GCC C++ g++ -O3 -Wall -c -fmessage-length=0 -Wno-sign-сравнить -fopenmp -MMD -MP -MF "генетический.d" -MT "генетический.d" -o "генетический.о" "../genetic.cpp" Законченное здание:../genetic.cpp Файл здания:../globals.cpp Вызов: GCC Компилятор C++ g++ -O3 -Wall -c -fmessage-length=0 -Wno-sign-сравнить -fopenmp -MMD -MP -MF "globals.d" -MT "globals.d" -o "globals.o" "../globals.cpp "Завершено построение:../globals.cpp Файл сборки:../logging.cpp Вызов: компилятор GCC C++ g++ -O3 -Wall -c -fmessage-length=0 -Wno-sign-сравнить -fopenmp -MMD -MP -MF"logging.d" -MT"logging.d" -o"logging.o" "../logging.cpp" Законченная сборка:../logging.cpp Файл сборки:../main. Вызов cpp: компилятор GCC C++ g++ -O3 -Wall -c -fmessage-length=0 -Wno-sign-сравнить -fopenmp -MMD -MP -MF "main.d" -MT "main.d" -o "main. o ""../main.cpp "Законченное здание:../main.cpp Файл сборки:../sampling.cpp Вызов: GCC C++ Компилятор g++ -O3 -Wall -c -fmessage-length=0 -Wno-sign-compare -fopenmp -MMD -MP -MF"sampling.d" -MT"sampling.d" -o"sampling.o" "../sampling.cpp" Законченное строительство:../sampling.cpp Файл сборки:../si mulation1.cpp Вызов: компилятор GCC C++ g++ -O3 -Wall -c -fmessage-length=0 -Wno-sign-сравнивать -fopenmp -MMD -MP -MF "Simulation1.d" -MT"Simulation1.D" -o " Simulation1.o" "../simulation1.cpp" ../globals.h: В глобальном масштабе: ../globals.h:43: предупреждение: встроенная функция 'double showDecimals(const double&, const int&)' используется, но никогда определено Завершено построение: ../simulation1.cpp Файл сборки: ../test_function.cpp Вызов: компилятор GCC C++ g++ -O3 -Wall -c -fmessage-length=0 -Wno-sign-сравнить -fopenmp -MMD -MP - MF "test_function.d" -MT "test_function.d" -o "test_function.o" "../test_function.cpp" Завершено построение: ../test_function.cpp Цель создания: pc2 Вызов: GCC C++ Linker g++ -fopenmp -o"pc2" ./COMPASS.o ./PSA.o ./SAR.o ./constraints.o ./genetic.o ./globals.o ./logging.o ./main.o ./sampling.o ./simulation1.o ./test_function.o ./logging.o: В функции `LOG_COMPASS_display_points_MATLAB(int const&, VisitedSet&)': logging.cpp:(.text+0x686): неопределенная ссылка на`VisitedSet::getSize()' collect2: ld вернул 1 состояние выхода make: *** [pc2] Ошибка 1 make: выход из каталога `/home/djunderw/ncsu/workspace/pc2/release'
Есть идеи?
[Исправлена проблема с функцией showDecimals()]
Файл COMPASS.h включает в себя этот шаблон класса:
template<class T> class VisitedSet {
public:
VisitedSet(const T& soln);
int getSize();
void addSolution(const T& soln);
void evaluate();
void sample(const int& numNewSolutions, Constraints& space);
void CSBiased_generateDistribution();
void constructMPA(Constraints& space);
vector<T> vec;
double bestValue;
int bestIndex;
/* used to implement biased coordinate sampling */
double CSBiased_coefficient;
vector< vector<double> > lastSampledPoints;
vector<int> lastSampledPointsIndex;
vector< vector<double> > newSampledPoints;
vector<int> newSampledPointsIndex;
vector<double> CSBiased_distribution;
private:
int iteration;
int dimension;
int SAR(); // simulation allocation rule
};
И COMPASS.cpp включает следующий код:
template<class T>
int VisitedSet<T>::getSize() {
return vec.size();
}
Файлы logging.cpp содержат следующий код:
#include "COMPASS.h"
void LOG_COMPASS_display_points_MATLAB(const int& iteration, VisitedSet<Policy>& visited) {
cout << "points{"<<iteration+1<<"} = [\n"
<< visited.vec[visited.bestIndex].x[0] << "\t" << visited.vec[visited.bestIndex].x[1] << "\t" << visited.vec[visited.bestIndex].meanQALY() << ";" << endl;
for(int i=0; i<visited.getSize(); i++) {
if(i != visited.bestIndex)
cout << visited.vec[i].x[0] << "\t" << visited.vec[i].x[1] << "\t" << visited.vec[i].meanQALY() << ";" << endl;
}
cout << "];\n";
}
1 ответ
Решение
int VisitedSet<T>::getSize()
является шаблонной функцией, поэтому ее определение должно быть в заголовочном файле, например COMPASS.h, а не в COMPASS.cpp.
И вот почему: http://www.parashift.com/c++-faq/templates-defn-vs-decl.html