2

我在让 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 做错了什么!?

如果您想了解某事的信息,请询问。

4

0 回答 0