Clang链接错误:LLVM传递

时间:2017-01-14 13:17:44

标签: makefile llvm clang++ llvm-clang llvm-ir

所以我遵循这个教程https://www.cs.cornell.edu/~asampson/blog/llvm.html通过添加对外部函数(在rtlib.c中的logop)的调用来创建程序。但是与教程不同的是,我试图使用更大的代码库来构建masstree:https://github.com/kohler/masstree-beta

所以按照masstree的指示我先运行./configure然后编辑生成的Makefile以使用clang(而不是gcc / g ++)并运行我的pass。我还在masstree源文件中添加了rtlib.c,以便它与其余的masstree源文件一起转换为rtlib.o。这是修改后的Makefile的相关部分,我的更改用箭头突出显示(我还添加了$(rtlib)以将其与其他.o文件链接以生成可执行文件):

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 $@ $<

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

%.S: %.o
    objdump -S $< > $@

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 $@
    $(AR) cru $@ $^

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 $@ $^ $(MEMMGR) $(LDFLAGS) $(LIBS)

mtclient: mtclient.o misc.o testrunner.o kvio.o $(rtlib) libjson.a
    $(CXX) $(CXXFLAGS) -o $@ $^ $(LDFLAGS) $(LIBS)

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

test_string: test_string.o string.o $(rtlib) straccum.o compiler.o
    $(CXX) $(CXXFLAGS) -o $@ $^ $(MEMMGR) $(LDFLAGS) $(LIBS)

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

jsontest: jsontest.o string.o straccum.o json.o compiler.o $(rtlib)
    $(CXX) $(CXXFLAGS) -o $@ $^ $(MEMMGR) $(LDFLAGS) $(LIBS)

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

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

我使用CC2和CXX2生成已检测的.o文件,而CC和CXX将它们链接到可执行文件。这是我运行make时得到的错误:

  

mtd.o:在函数main': /home/.../masstree-beta-master/mtd.cc:730: undefined reference to logop&#39;   /home/.../masstree-beta-master/mtd.cc:730:对logop' /home/.../masstree-beta-master/mtd.cc:732: undefined reference to logop&#39;的未定义引用   /home/.../masstree-beta-master/mtd.cc:732:对logop' /home/.../masstree-beta-master/mtd.cc:736: undefined reference to logop&#39;的未定义引用   mtd.o:/ home /.../ masstree-beta-master / mtd.cc:736:更多未定义的引用`logop&#39;跟随   clang:错误:链接器命令失败,退出代码为1(使用-v查看调用)   make:*** [mtd]错误1。

为什么我的函数logop(在rtlib.c中)的引用未定义,即使我在链接部分添加rtlib.o以生成可执行文件?

非常感谢你!

1 个答案:

答案 0 :(得分:1)

导出的符号不一样。我使用nm --format sysv *file.o*检查以确保从rtlib.o导出的符号和使用它们的位置相同。