我在让 Eigen 使用优化 -O2 集进行编译时遇到了一些麻烦。如果我将 -O2 换成 -g 编译完成,并且程序运行没有错误。设置 -O2 后,链接器会抛出以下内容:
build/main.o:main.cpp:function displayTrainingScoreInfo(): error: undefined reference to 'TrainingManager::sumAllScores(std::vector<Eigen::Array<double, -1, 1, 0, -1, 1>, std::allocator<Eigen::Array<double, -1, 1, 0, -1, 1> > >&)'
无论我使用哪个选项编译,我都会在编译的早期收到警告
warning: inline function ‘double TrainingManager::sumAllScores(std::vector<Eigen::Array<double, -1, 1> >&)’ used but never defined
我怀疑这是因为我将 Eigen 数组初始化为一定大小。这不是编译时已知的大小(见下文)。但是我已经对它们进行了未初始化的测试,并且遇到了同样的问题
TrainingManager.h 包含定义:
inline double sumAllScores(std::vector<Eigen::ArrayXd > & scaledScores);
main.cpp - 有问题的函数减去一些用户输出(错误完整)
void displayTrainingScoreInfo() {
if (nnLoaded) {
// Get all the calculation data
const int nCases = tm.cases->nCases;
const unsigned nOutputs = tm.cases->nOutputs;
std::vector<Eigen::ArrayXd > results(nCases,Eigen::ArrayXd(nOutputs));
std::vector<Eigen::ArrayXd > scores(nCases,Eigen::ArrayXd(nOutputs));
std::vector<Eigen::ArrayXd > scaledScores(nCases,Eigen::ArrayXd(nOutputs));
tm.calculateAllCases(nn.mlp,results);
tm.score(results,scores);
tm.scale(scores,scaledScores);
// SOME USER OUTPUT LOOPS OMITTED
std::cout << "\nMLP TestCase Total:\t" << tm.sumAllScores(scaledScores) << std::endl;
} else {
error_msg("You must load cases and a network before you can see scores");
}
}
培训管理器.cpp
double TrainingManager::sumAllScores(std::vector<Eigen::ArrayXd > & scaledScores) {
double total = 0.0;
unsigned outputs = scaledScores.at(0).size();
for (unsigned x = 0; x < scaledScores.size(); x++) {
for (unsigned y = 0; y < outputs; y++) {
total += scaledScores.at(x)[y];
}
}
return total;
}
避免这些错误的最佳方法是什么?或者,我对 Eigen 做错了什么!?
如果您想了解某事的信息,请询问。