メイクファイルは、プロジェクトのために私はヒットにこのラインで働いていた場合:私は次のエラーを取得するグラムが++の参照は未定義で言っても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
フラグなし)でコンパイルされました。
私はこの種のリンクエラーに関する他のいくつかの質問を見ましたが、私が読んだ回答はここには当てはまりません。すべての部分がそこにあるように思えますが、なぜリンカがそれをまとめることができないのか考えている人はいますか?
これはまさにそれでした - ありがとうございました。私はローカルではないことを知っていましたが、そのコンテキスト内のローカルは個々のオブジェクトファイルではなく共有ライブラリを参照していると思いました。 – xanderflood