【发布时间】:2011-08-12 14:16:35
【问题描述】:
我目前正在编写一个仅包含标头的包装库,它应该提供对某些 FORTRAN 代码的 C++ 访问。但我被困在'未定义的参考(...)'
我必须说我有点惊讶,因为我使用这个 FORTRAN 例程在 C++ 中编译了自己的函数,完全没有问题。
也许是关于结构的几句话。该库遵循单例模式,但用户无法实例化该库。所以用户的唯一入口点是静态方法MultiNestWrapper::Wrapper<T>::run()。 MultiNestWrapper 是一个命名空间,Wrapper<T> 是一个模板类(以便将来您可以对选择执行计算的类型如何影响结果和性能进行基准测试)。 FORTRAN 例程在此命名空间之外声明,如
extern "C" {
extern void __nested_MOD_nestrun(int *, int *, int *, double *, double *, int *, int *, int *, int *, int *, double *, const char *, int *, int *, int *, int *, void (*Loglike)(double *, int *, int *, double *), void (*dumper)(int *, int *, int *, double **, double **, double *, double *, double *), int *context);
}
我这样称呼它
__nested_MOD_nestrun(&_mmodal, &_ceff, &_nlive, &_tol, &_efr, &_ndims, &_nPar, &_nClsPar, &_maxModes, &_updInt, &_Ztol, _root, &_seed, _pWrap, &_fb, &_resume, internalLogLike, internalDumper, &_context);
并且参数的类型匹配。
当我尝试编译它时,我收到以下错误:
[dare2be@schroedinger multinest-interfejs]$ make all
g++ -c ExampleLibMnCpp.cpp -o ExampleLibMnCpp.o
gfortran -lstdc++ -llapack -lblas -lnest3 -L/usr/local/lib ExampleLibMnCpp.o -o ExampleLibMnCpp
ExampleLibMnCpp.o: In function `MultiNestWrapper::Wrapper<double>::run(MultiNestWrapper::MNParams<double>*, double (*)(double const*, int), bool, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int, double, int, double, void (*)(int*, int*, int*, double**, double**, double*, double*, double*), int, double, bool)':
ExampleLibMnCpp.cpp:(.text._ZN16MultiNestWrapper7WrapperIdE3runEPNS_8MNParamsIdEEPFdPKdiEbSsididPFvPiS9_S9_PPdSB_SA_SA_SA_Eidb[MultiNestWrapper::Wrapper<double>::run(MultiNestWrapper::MNParams<double>*, double (*)(double const*, int), bool, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int, double, int, double, void (*)(int*, int*, int*, double**, double**, double*, double*, double*), int, double, bool)]+0x585): undefined reference to `__nested_MOD_nestrun'
collect2: ld returned 1 exit status
make: *** [ExampleLibMnCpp] Error 1
但是,请注意
[dare2be@schroedinger multinest-interfejs]$ nm /usr/local/lib/libnest3.a | grep __nested_MOD_nestrun
000000000001e0f0 T __nested_MOD_nestrun
我自己总是处理那些未定义的引用。但是现在我无法解决这个问题。我指定-lnest3 -L/usr/local/lib explicite 和/usr/local/lib/libnest3.a 包含链接器抱怨的例程......请帮助兄弟! :)
编辑:修正错别字
【问题讨论】:
-
什么是整个链接线?
-
您提到 C++ 代码在模板类中。有没有实例化过它?
-
是的,有一个实例化——这就是你看到
MultiNestWrapper::Wrapper<double>的原因 -
顺便说一句,由于模块过程 ABI 是一个可能会更改的实现细节,因此最好使用 ISO_C_BINDING 来创建与 Fortran 过程的绑定。