2017-01-14 7 views
0

このチュートリアルの後には、外部関数(rtlib.cのlogop)に呼び出しを追加してプログラムを計測するためのパスを作るためのチュートリアルhttps://www.cs.cornell.edu/~asampson/blog/llvm.htmlに従っています。しかし、チュートリアルとは違って、私はmasstreeというより大きなコードベースを装備しようとしています:https://github.com/kohler/masstree-betaClangリンクエラー:LLVMによって追加された関数呼び出しへの未定義の参照

masstreeの指示どおりに./configureを実行してから、生成されたMakefileを編集してgcc/g ++の代わりにclangを使用し、パスを実行します。 masstreeソースファイルにrtlib.cを追加して、残りのmasstreeソースファイルとともにrtlib.oに変換されるようにします。私はCC2とCXX2を使用

AR = ar 
rtlib = rtlib.o <=== 
CC2 = clang -w -v -Xclang -load -Xclang /.../llvm-3.4/Release+Asserts/lib/SkeletonPass.so `llvm-config --cflags` 
CXX2 = clang++ -v -w -Xclang -load -Xclang /.../llvm-3.4/Release+Asserts/lib/SkeletonPass.so -std=c++11 `llvm-config --cppflags --libs --cflags --cxxflags core --ldflags` <=== 
CC = clang -v <=== 
CXX = clang++ -v -std=c++11 <=== 
CPPFLAGS = 
CXXFLAGS = -g -W -Wall -O3 
DEPSDIR := .deps 
DEPCFLAGS = -MD -MF $(DEPSDIR)/$*.d -MP 
ifeq ($(strip $(MEMMGR)),) 
    MEMMGR = 
endif 
ifneq ($(strip $(KEYSWAP)),) 
    CPPFLAGS += -DKEYSWAP 
endif 
ifneq ($(strip $(NOPREFETCH)),) 
    CPPFLAGS += -DNOPREFETCH 
endif 
ifneq ($(strip $(NOSUPERPAGE)),) 
    CPPFLAGS += -DNOSUPERPAGE 
endif 
LIBS = -lpthread -lm 
LDFLAGS = 

all: test_atomics mtd mtclient mttest 

%.o: %.c config.h $(DEPSDIR)/stamp 
    $(CXX2) $(CPPFLAGS) $(CXXFLAGS) $(DEPCFLAGS) -include config.h -c -o [email protected] $< 

%.o: %.cc config.h $(DEPSDIR)/stamp 
    $(CXX2) $(CPPFLAGS) $(CXXFLAGS) $(DEPCFLAGS) -include config.h -c -o [email protected] $< 

%.S: %.o 
    objdump -S $< > [email protected] 

libjson.a: json.o string.o straccum.o str.o msgpack.o \ 
    clp.o kvrandom.o compiler.o memdebug.o kvthread.o 
    @/bin/rm -f [email protected] 
    $(AR) cru [email protected] $^ 

KVTREES = query_masstree.o \ 
    value_string.o value_array.o value_versioned_array.o \ 
    string_slice.o 

mtd: mtd.o log.o checkpoint.o file.o misc.o $(rtlib) $(KVTREES) \ 
    kvio.o libjson.a 
    $(CXX) $(CXXFLAGS) -o [email protected] $^ $(MEMMGR) $(LDFLAGS) $(LIBS) 

mtclient: mtclient.o misc.o testrunner.o kvio.o $(rtlib) libjson.a 
    $(CXX) $(CXXFLAGS) -o [email protected] $^ $(LDFLAGS) $(LIBS) 

mttest: mttest.o misc.o checkpoint.o $(rtlib) $(KVTREES) testrunner.o \ 
    kvio.o libjson.a 
    $(CXX) $(CXXFLAGS) -o [email protected] $^ $(MEMMGR) $(LDFLAGS) $(LIBS) 

test_string: test_string.o string.o $(rtlib) straccum.o compiler.o 
    $(CXX) $(CXXFLAGS) -o [email protected] $^ $(MEMMGR) $(LDFLAGS) $(LIBS) 

test_atomics: test_atomics.o string.o straccum.o kvrandom.o $(rtlib) \ 
    json.o compiler.o kvio.o 
    $(CXX) $(CXXFLAGS) -o [email protected] $^ $(MEMMGR) $(LDFLAGS) $(LIBS) 

jsontest: jsontest.o string.o straccum.o json.o compiler.o $(rtlib) 
    $(CXX) $(CXXFLAGS) -o [email protected] $^ $(MEMMGR) $(LDFLAGS) $(LIBS) 

msgpacktest: msgpacktest.o string.o straccum.o json.o compiler.o msgpack.o $(rtlib) 
    $(CXX) $(CXXFLAGS) -o [email protected] $^ $(MEMMGR) $(LDFLAGS) $(LIBS) 

scantest: scantest.o compiler.o misc.o $(rtlib) $(KVTREES) libjson.a 
    $(CXX) $(CXXFLAGS) -o [email protected] $^ $(MEMMGR) $(LDFLAGS) $(LIBS) 

:ここに私の変更を伴う変更のMakefileの関連部分を矢印で強調表示されます(私も$(rtlib)実行可能ファイルを生成するために、他の.oファイルとリンクすることを追加しました)計装された.oファイルを生成し、CCおよびCXXを実行可能ファイルにリンクします。ここで私はmakeを実行したときに私が得るエラーは次のとおりです。

mtd.o: In function main': /home/.../masstree-beta-master/mtd.cc:730: undefined reference to logop' /home/.../masstree-beta-master/mtd.cc:730: undefined reference to logop' /home/.../masstree-beta-master/mtd.cc:732: undefined reference to logop' /home/.../masstree-beta-master/mtd.cc:732: undefined reference to logop' /home/.../masstree-beta-master/mtd.cc:736: undefined reference to logop' mtd.o:/home/.../masstree-beta-master/mtd.cc:736: more undefined references to `logop' follow clang: error: linker command failed with exit code 1 (use -v to see invocation) make: *** [mtd] Error 1.

(rtlib.cである)私の関数logopへの参照は未定義は私が連結部にrtlib.oを追加するにもかかわらず、である理由上の任意のアイデア実行可能ファイルを生成しますか?

ありがとうございました!

+0

考えられる考え方: 1)リンクするオブジェクトファイルの最後にrtlib.oを挿入します。 2)C++コンパイラでrtlib.oをビルドします。 3)rtlib.oが関数(objdump -t)をエクスポートしていることを確認します。 4)mtd.oのシンボルが、rtlib.oのエクスポートされたシンボルと一致することを確認します。 – Brian

+0

あなたの返信ありがとう!私は、objdump -Sを使用してmtd.oを調べ、私の外部関数logop(int、int、char)の呼び出しを見つけることができませんでした。 'logopへの未定義参照 'というエラーは、関数呼び出しが挿入されているが、リンカーが関数logopの定義を見つけることができないことを意味していたと私は混乱している。さらに、行730と732などは、挿入された。 –

+0

@Brian、私の最後のコメントの後の考え? –

答えて

1

エクスポートされるシンボルは同じではありません。 nm --format sysv *file.o*を使って、rtlib.oからエクスポートされたシンボルがどこで使われていても同じであることを確認しました。

関連する問題