4

最適化されていないオブジェクト ファイルをリンクするときではなく、最適化されたオブジェクト ファイルをリンクするときにのみ、未定義の参照リンカー エラーが発生します。問題が何であるか、またはその可能性があるかわかりません。

最適化されていないビルドは次のとおりです。

ビルドファイル: ../COMPASS.cpp
呼び出し: GCC C++ コンパイラ
g++ -O0 -g3 -pg -Wall -c -fmessage-length=0 -Wno-sign-compare -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-compare -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-compare -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-compare -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-compare -fopenmp -MMD -MP -MF"genetic.d" -MT"genetic.d" -o"genetic.o" "../genetic.cpp"
完成したビルド: ../genetic.cpp

ビルド ファイル: ../globals.cpp
呼び出し: GCC C++ コンパイラ
g++ -O0 -g3 -pg -Wall -c -fmessage-length=0 -Wno-sign-compare -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-compare -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-compare -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-compare -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-compare -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++ -O0 -g3 -pg -Wall -c -fmessage-length=0 -Wno-sign-compare -fopenmp -MMD -MP -MF"test_function.d" -MT"test_function.d" -o"test_function.o" "../test_function.cpp"
ビルド完了: ../test_function.cpp

ビルド対象:pc2
呼び出し: GCC C++ リンカ
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-compare -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-compare -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-compare -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 -Wno-sign-compare -fopenmp -MMD -MP -MF"constraints.d" -MT"constraints.d" -o"constraints.o" "../制約.cpp"
完成したビルド: ../constraints.cpp

ビルドファイル: ../genetic.cpp
呼び出し: GCC C++ コンパイラ
g++ -O3 -Wall -c -fmessage-length=0 -Wno-sign-compare -fopenmp -MMD -MP -MF"genetic.d" -MT"genetic.d" -o"genetic.o" "../遺伝.cpp」
完成したビルド: ../genetic.cpp

ビルド ファイル: ../globals.cpp
呼び出し: GCC C++ コンパイラ
g++ -O3 -Wall -c -fmessage-length=0 -Wno-sign-compare -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-compare -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-compare -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" "../サンプリング.cpp」
完成したビルド: ../sampling.cpp

ビルドファイル: ../simulation1.cpp
呼び出し: GCC C++ コンパイラ
g++ -O3 -Wall -c -fmessage-length=0 -Wno-sign-compare -fopenmp -MMD -MP -MF"simulation1.d" -MT"simulation1.d" -o"simulation1.o" "../シミュレーション1.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-compare -fopenmp -MMD -MP -MF"test_function.d" -MT"test_function.d" -o"test_function.o" "../ test_function.cpp"
ビルド完了: ../test_function.cpp

ビルド対象:pc2
呼び出し: GCC C++ リンカ
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";
}
4

1 に答える 1

5

int VisitedSet<T>::getSize()はテンプレート化された関数であるため、その定義は COMPASS.cpp ではなく、COMPASS.h などのヘッダー ファイルにある必要があります。

理由は次のとおりです: http://www.parashift.com/c++-faq/templates-defn-vs-decl.html

于 2012-09-03T19:27:53.500 に答える