设置 -O2 时出现特征“未定义引用”错误

Eigen 'undefined reference to' error when -O2 is set

提问人:joeButler 提问时间:10/23/2013 最后编辑:joeButler 更新时间:10/23/2013 访问量:973

问:

我在让 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 

我怀疑这是因为我将特征数组初始化为特定大小。这不是编译时已知的大小(见下文)。但是我已经在未初始化的情况下测试了它们,我遇到了同样的问题

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

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

C++ 链接器 未定义引用 特征

评论

0赞 Iłya Bursov 10/23/2013
sumAllScores代码在哪里定义?不仅是原型,还有代码?
0赞 joeButler 10/23/2013
它在 TrainingManager.cpp 中 - 它工作正常,但我会添加它
1赞 10/23/2013
应始终将内联函数定义与声明一起放在头文件中。
2赞 Iłya Bursov 10/23/2013
将 sumAllScores 的所有定义移动到单个文件,最好是 .h 文件
1赞 10/23/2013
是的。官方建议将内联函数放在头文件中,以确保编译器可以在包含它们的每个翻译单元中看到它。

答: 暂无答案