簡體   English   中英

無法通過“對‘XXXX’的未定義引用”

[英]Can't get past “undefined reference to `XXXX'”

我目前正在編寫一個僅包含標頭的包裝庫,它應該提供 C++ 對某些 FORTRAN 代碼的訪問。 但我被困在'未定義的參考(...)'

我必須說我有點驚訝,因為我使用這個 FORTRAN 例程在 C++ 中編譯了我自己的函數,完全沒有問題。

也許關於結構的幾句話。 該庫遵循 singleton 模式,但用戶無法實例化該庫。 因此,用戶的唯一入口點是 static 方法MultiNestWrapper::Wrapper<T>::run() MultiNestWrapper是一個命名空間, Wrapper<T>是一個模板化的 class (以便將來您可以基准測試選擇執行計算的類型如何影響結果和性能)。 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);

arguments 的類型匹配。

當我嘗試編譯它時,我收到以下錯誤:

[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顯式/usr/local/lib/libnest3.a包含例程 linker 抱怨...請幫助兄弟::)

編輯:修正錯別字

在 GCC 的命令行中指定庫的順序很重要。 有關詳細信息,請閱讀 GCC 手冊頁 - 簡而言之,您必須在使用它們的模塊之后指定庫( -lnest3等)。 (我總是在命令行末尾指定庫。)

在你的情況下,你必須寫

gfortran ExampleLibMnCpp.o -o ExampleLibMnCpp -L/usr/local/lib -lstdc++ -llapack -lblas -lnest3

將所有內容鏈接在一起時,您可能需要在庫之前指定源文件。 像這樣:

gfortran *.o -lblas -l... ...

鏈接器有時對其 arguments 的順序很挑剔。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM