Clang Libtool行为根据生成的二进制文件的位置而有所不同

时间:2017-07-11 14:54:45

标签: clang llvm-clang

我创建了一个非常简单的基于Clang Libtool的程序,它构建了一个AST并将AST转储到控制台。

我正在使用以下命令编译/链接我在LLVM / Clang源代码树外部的程序与来自http://releases.llvm.org/download.html的预构建二进制文件之一 -

c++ -DCLANG_ENABLE_ARCMT -DCLANG_ENABLE_OBJC_REWRITER -DCLANG_ENABLE_STATIC_ANALYZER -DGTEST_HAS_RTTI=0 -DLLVM_BUILD_GLOBAL_ISEL -D_DEBUG -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -I/llvm-3.9.1/clang+llvm-3.9.1-x86_64-linux-gnu-debian8/include -fPIC -fvisibility-inlines-hidden -Wall -W -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wno-missing-field-initializers -pedantic -Wno-long-long -Wno-maybe-uninitialized -Wdelete-non-virtual-dtor -Wno-comment -Werror=date-time -std=c++11 -fno-common -Woverloaded-virtual -fno-strict-aliasing -g -fno-exceptions -fno-rtti -o main.cpp.o -c Main.cpp

然后使用以下命令进行链接 -

c++ -fPIC -fvisibility-inlines-hidden -Wall -W -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wno-missing-field-initializers -pedantic -Wno-long-long -Wno-maybe-uninitialized -Wdelete-non-virtual-dtor -Wno-comment -Werror=date-time -std=c++11 -fno-common -Woverloaded-virtual -fno-strict-aliasing -g -Wl,-allow-shlib-undefined -Wl,-rpath-link,/llvm-3.9.1/clang+llvm-3.9.1-x86_64-linux-gnu-debian8/lib main.cpp.o -o myprogram -Wl,-rpath,/llvm-3.9.1/clang+llvm-3.9.1-x86_64-linux-gnu-debian8/lib -L/llvm-3.9.1/clang+llvm-3.9.1-x86_64-linux-gnu-debian8/lib -lpthread -lclangTooling -lclangBasic -lclangASTMatchers -lclangFormat -lclangFrontend -lclangDriver -lclangParse -lLLVMMCParser -lclangSerialization -lclangSema -lclangEdit -lclangAnalysis -lLLVMBitReader -lLLVMProfileData -lclangToolingCore -lclangAST -lclangRewrite -lclangLex -lclangBasic -lLLVMCore -lLLVMMC -lLLVMOption -lLLVMSupport -lrt -ldl -ltinfo -lpthread -lz -lm

我发现上述两个步骤没有错误或问题。

如果我将此 myprogram 二进制文件复制到/llvm-3.9.1/clang+llvm-3.9.1-x86_64-linux-gnu-debian8/bin目录并运行它,则会生成AST正确并按预期运行。

但是如果我从任何其他位置运行这个二进制文件,我看不到任何警告或错误,但AST没有生成。程序转储在预处理阶段后生成的不完整的AST。

我在链接时尝试使用-static标记,并将${LD_LIBRARY_PATH}值设置为/llvm-3.9.1/clang+llvm-3.9.1-x86_64-linux-gnu-debian8/lib文件夹,但这没有任何区别。

由于程序在移动到llvm / bin文件夹时正常运行,但在其他任何地方存在时无法正常运行。看起来程序加载了一些相对于/ bin目录的库,但是我无法弄清楚需要设置什么来确保程序正常运行并将其移动到其他地方。

请任何人提供有关如何进行的任何建议。感谢。

1 个答案:

答案 0 :(得分:0)

这里的问题是在编译/链接Clang Libtool程序之后,当我们执行程序时,我们需要为指向llvm版本的lib文件夹的可执行文件提供 -isystem 标志。方式 -

$ ./myprogram -isystem/{CLANG_PATH}/lib "other args"

使用llvm-5.0,我注意到在链接时使用 -static 关键字会导致出现类似于此stackoverflow post的glib版本警告。

我能够通过在我的Makefile-

中正确设置-rpath标志来解决这个问题
"-Wl,-rpath,$(CLANG_PATH)/lib"