代码之家  ›  专栏  ›  技术社区  ›  Hari Reddy

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

  •  0
  • Hari Reddy  · 技术社区  · 8 年前

    我创建了一个非常简单的基于ClangLibTool的程序,该程序构建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
    

    我认为上述两个步骤没有错误或问题。

    我的计划

    但是,如果我从任何其他位置运行这个二进制文件,我看不到任何警告或错误,但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 回复  |  直到 8 年前
        1
  •  0
  •   Hari Reddy    8 年前

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

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

    -静态 post .

    我可以通过在我的Makefile中正确设置-rpath标志来解决这个问题-

    "-Wl,-rpath,$(CLANG_PATH)/lib"