【问题标题】:C++ Undefined symbols for architecture x86_64 with user defined function具有用户定义函数的架构 x86_64 的 C++ 未定义符号
【发布时间】:2013-10-03 14:05:07
【问题描述】:

我在编译时收到以下错误消息。

    Undefined symbols for architecture x86_64:
  "LSMDP2<HC_Base, HC_Base, Sine>::LSMDP2(int, int, std::unique_ptr<Forward, std::default_delete<Forward> >&, std::unique_ptr<BrownianMotionIncGenerator, std::default_delete<BrownianMotionIncGenerator> >&, std::unique_ptr<Driver, std::default_delete<Driver> >&, Sine&&, gsl_vector*, std::unique_ptr<Regression, std::default_delete<Regression> >&, std::unique_ptr<UniformSims, std::default_delete<UniformSims> >&, std::unique_ptr<TimeGrid, std::default_delete<TimeGrid> >&, HC_Base&&, HC_Base&&)", referenced from:
      LSMDP2<HC_Base, HC_Base, Sine> make_LSMDP2<HC_Base, HC_Base, Sine>(int, int, std::unique_ptr<Forward, std::default_delete<Forward> >&, std::unique_ptr<BrownianMotionIncGenerator, std::default_delete<BrownianMotionIncGenerator> >&, std::unique_ptr<Driver, std::default_delete<Driver> >&, Sine&&, gsl_vector*, std::unique_ptr<Regression, std::default_delete<Regression> >&, std::unique_ptr<UniformSims, std::default_delete<UniformSims> >&, std::unique_ptr<TimeGrid, std::default_delete<TimeGrid> >&, HC_Base&&, HC_Base&&) in main.o


ld: symbol(s) not found for architecture x86_64

collect2: error: ld returned 1 exit status

make: *** [BSDESimV2] Error 1

应该是未定义的符号是

template<class BasisY, class BasisZ, class Term>  LSMDP2<BasisY,BasisZ,Term> make_LSMDP2(int N, int q , F_Forward_  & F  ,
         BM_Inc_ & B,   B_Driver_ & D,  Term && Ter,  gsl_vector * X0 ,
        A_Regression_& R, A_UniSims_ & M, T_Grid_ & T /*Time grid initializer*/, BasisY && BY, BasisZ && BZ){
return LSMDP2<BasisY,BasisZ,Term>{N, q ,F, B, D, std::forward<Term>(Ter), X0, R, M , T, std::forward<BasisY>(BY), std::forward<BasisZ>( BZ) };
}

此函数包含在定义 LSMDP2 类的头文件中。我检查了链接,没问题,构造函数“LSMPD2(....)”是在单独的 cpp 文件中定义的。我确保不会犯常见的错误,例如搞砸链接、忘记构建 cpp 文件、忘记定义构造函数或使用 gcc 而不是 g++。

实际上,我在一个更简单的示例上尝试了相同的构造 - 编译中只有一个 cpp 文件,参数更少,但模板和 unique_ptrs 都在使用中 - 效果很好。有谁知道是什么导致了这个问题?

【问题讨论】:

  • 如果你有一个可行的情况和一个不可行的情况,解决问题的方法是尝试打破可行的情况,使其更像不可行的情况'不工作。如果您需要 SO 的帮助,请发布您的链接器命令行。

标签: c++ compiler-errors undefined-symbol


【解决方案1】:

您说 LSMPD2 构造函数是“在单独的 cpp 文件中定义的”。那是你的问题。由于该类显然是一个模板,所以该类在外部使用的所有方法都必须在头文件中定义,而不是单独编译的实现文件。

更多详情请看这里:Why can templates only be implemented in the header file?

【讨论】:

    猜你喜欢
    • 2016-06-20
    • 1970-01-01
    • 2017-12-03
    • 2015-06-15
    • 1970-01-01
    • 2014-08-07
    • 2012-07-20
    • 2014-05-14
    • 2015-06-17
    相关资源
    最近更新 更多