2016-10-22 15 views
0

メイクファイルは、プロジェクトのために私はヒットにこのラインで働いていた場合:私は次のエラーを取得するグラムが++の参照は未定義で言ってもnm`リスト `しかし私のオブジェクトファイル内のシンボル定義

g++ -g build_complex.o simplex.o simplex_src.o split.o permutation_src.o permutation_parity.o tropmod.o main.o -L/usr/lib/x86_64-linux-gnu -L/usr/local/lib -L/usr/lib/sagemath/local/lib/ -ligraph -lm -o cpptest 

を:

main.o: In function `main': 
/home/xander/Desktop/tropicalmoduli/main.cpp:5: undefined reference to `(anonymous namespace)::ConfigSpace::ConfigSpace(int, int)' 
/home/xander/Desktop/tropicalmoduli/main.cpp:9: undefined reference to `(anonymous namespace)::PermWrapper::PermWrapper(permutation*)' 
/home/xander/Desktop/tropicalmoduli/main.cpp:11: undefined reference to `(anonymous namespace)::ConfigSpace::getTraceOfPerm((anonymous namespace)::PermWrapper)' 
collect2: error: ld returned 1 exit status 

これらはtropmod.cppファイルで定義されており、tropmod.oにコンパイルされた関数です。私は実行するとnm tropmod.oは吐き出す:

    U __cxa_atexit 
       U __dso_handle 
       U free 
       U _GLOBAL_OFFSET_TABLE_ 
000000000000037c t _GLOBAL__sub_I_tropmod.cpp 
       U igraph_destroy 
       U malloc 
       U _Z10split_freeP5split 
       U _Z12simplex_freeP7simplex 
       U _Z13simplex_traceP7simplexP11permutation 
       U _Z14get_1_skeletoniiPPP5split 
       U _Z16get_mid_skeletoniiiPiPP5splitP8igraph_s 
0000000000000333 t _Z41__static_initialization_and_destruction_0ii 
00000000000001f0 t _ZN12_GLOBAL__N_111ConfigSpace14getTraceOfPermENS_11PermWrapperE 
000000000000010c t _ZN12_GLOBAL__N_111ConfigSpace7destroyEv 
0000000000000000 t _ZN12_GLOBAL__N_111ConfigSpaceC2Eii 
0000000000000322 t _ZN12_GLOBAL__N_111PermWrapper14getPermutationEv 
0000000000000304 t _ZN12_GLOBAL__N_111PermWrapperC2EP11permutation 
       U _ZNSt8ios_base4InitC1Ev 
       U _ZNSt8ios_base4InitD1Ev 
0000000000000000 b _ZStL8__ioinit 

すべての「未定義の参照は、」彼らは、このオブジェクト・ファイルに定義されていることを意味すべきである「T」、と、ここに記載されています。ここでmain.cppで、完全について

#include <iostream> 
#include <string> 
#include "build_complex.h" 

#ifdef tmboost 
#include <boost/python/list.hpp> 
#include <boost/python/extract.hpp> 
typedef boost::python::list bplist; 
#endif 

namespace { 

    // allows a permutation to be converted from python::boost::list 
    // to permutation* just once, and then reused 
    class PermWrapper { 
     permutation *perm; 

     public: 
     #ifdef tmboost 
     PermWrapper(bplist); 
     #endif 
     PermWrapper(permutation*); 

     permutation *getPermutation(); 
    }; 

    class ConfigSpace { 
     int n,d; 
     int *num_cells; 
     int num_facets; 
     split **all_splits; 
     simplex ***skels; 

     public: 
     ConfigSpace(int n, int d); 

     void destroy(); 

     int getTraceOfPerm(PermWrapper perm); 
    }; 
} 

:tropmod.oとmain.oの両方が宣言を見つけることができるヘッダファイルtropmod.hppを含むの.cppファイルからコンパイルされた

#include "tropmod.hpp" 

int main() { 

    ConfigSpace cs = ConfigSpace(2, 2); 

    int p_d[4] = {1, 0, 3, 2}; 
    permutation *p = perm_alloc_data(4, p_d); 
    PermWrapper pw = PermWrapper(p); 

    printf("trace: %i\n", cs.getTraceOfPerm(pw)); 
} 

両方をcppファイルはg++ -g -fPIC -c(そしてtmboostフラグなし)でコンパイルされました。

私はこの種のリンクエラーに関する他のいくつかの質問を見ましたが、私が読んだ回答はここには当てはまりません。すべての部分がそこにあるように思えますが、なぜリンカがそれをまとめることができないのか考えている人はいますか?

答えて

2

C++では、anonymous namespaces are local to their translation unitであり、他の翻訳単位から参照することはできません。

nmのドキュメントを読むと、小文字でローカルシンボルタイプが指定されていることが明確に記載されています。

グローバルシンボルの場合は、「t」ではなく「t」とマークされます。

+0

これはまさにそれでした - ありがとうございました。私はローカルではないことを知っていましたが、そのコンテキスト内のローカルは個々のオブジェクトファイルではなく共有ライブラリを参照していると思いました。 – xanderflood