将JSON库添加到Clang libtooling项目
Adding json library to clang libtooling project
我正在使用clang libtool编写递归eastvisitor。
现在,我正在尝试在JSON文件中阅读,并从https://github.com/open-source-parsers/jsoncpp
下载了JSON库我已通过" Include/json"在我的项目路径上复制了llvm/tools/clang/include"
"使用ninja命令编译时,Incluph命令不会抛出任何错误 include "json/json.h"
但是,当我尝试输入代码 Json::Value root
行时,它会引发链接错误。
完整错误日志:
ninja -v
[1/1] : && /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -fPIC -fvisibility-inlines-hidden -Wall -W -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -pedantic -Wno-long-long -Wcovered-switch-default -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Werror=date-time -std=c++11 -fcolor-diagnostics -fno-common -Woverloaded-virtual -Wno-nested-anon-types -g -Wl,-search_paths_first -Wl,-headerpad_max_install_names tools/clang/tools/extra/myASTChecker/CMakeFiles/MyASTChecker.dir/MyASTChecker.cpp.o -o bin/MyASTChecker lib/libLLVMSupport.a lib/libclangTooling.a lib/libclangASTMatchers.a lib/libclangFormat.a lib/libclangFrontend.a lib/libclangDriver.a lib/libLLVMOption.a lib/libclangParse.a lib/libLLVMMCParser.a lib/libclangSerialization.a lib/libclangSema.a lib/libclangEdit.a lib/libclangAnalysis.a lib/libLLVMBitReader.a lib/libLLVMProfileData.a lib/libclangToolingCore.a lib/libclangAST.a lib/libclangRewrite.a lib/libclangLex.a lib/libclangBasic.a lib/libLLVMCore.a lib/libLLVMMC.a lib/libLLVMSupport.a -lcurses -lpthread -lz -lm -Wl,-rpath,@executable_path/../lib && :
FAILED: bin/MyASTChecker
: && /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -fPIC -fvisibility-inlines-hidden -Wall -W -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -pedantic -Wno-long-long -Wcovered-switch-default -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Werror=date-time -std=c++11 -fcolor-diagnostics -fno-common -Woverloaded-virtual -Wno-nested-anon-types -g -Wl,-search_paths_first -Wl,-headerpad_max_install_names tools/clang/tools/extra/myASTChecker/CMakeFiles/MyASTChecker.dir/MyASTChecker.cpp.o -o bin/MyASTChecker lib/libLLVMSupport.a lib/libclangTooling.a lib/libclangASTMatchers.a lib/libclangFormat.a lib/libclangFrontend.a lib/libclangDriver.a lib/libLLVMOption.a lib/libclangParse.a lib/libLLVMMCParser.a lib/libclangSerialization.a lib/libclangSema.a lib/libclangEdit.a lib/libclangAnalysis.a lib/libLLVMBitReader.a lib/libLLVMProfileData.a lib/libclangToolingCore.a lib/libclangAST.a lib/libclangRewrite.a lib/libclangLex.a lib/libclangBasic.a lib/libLLVMCore.a lib/libLLVMMC.a lib/libLLVMSupport.a -lcurses -lpthread -lz -lm -Wl,-rpath,@executable_path/../lib && :
Undefined symbols for architecture x86_64:
"Json::Value::Value(Json::ValueType)", referenced from:
MyASTFrontendAction::CreateASTConsumer(clang::CompilerInstance&, llvm::StringRef) in MyASTChecker.cpp.o
"Json::Value::~Value()", referenced from:
MyASTFrontendAction::CreateASTConsumer(clang::CompilerInstance&, llvm::StringRef) in MyASTChecker.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.
我缺少什么或应该做什么?
使用ninja命令编译时,Incluph命令不会抛出任何错误
include "json/json.h"
当您将标头文件复制到编译器的搜索路径中的文件夹中时。您不会在#include "json/json.h"
中遇到问题,因为是的,该文件在那里,并且您还没有使用任何内容,因此它只是一些功能,类声明将被忽略。
但是,当我尝试输入Code JSON ::值root的一行时,它会引发链接错误。
现在,当撰写Json::Value root;
时,发生的事情是您称为Json::Value
的构造函数,该构造函数在随附的标头文件中声明,但在源文件中实现。因此,编译器无法找到构造函数的实现,并抱怨它。
它可能奏效了整个JSON解析器库在随附的标头文件中实现。这样,编译器将发现具有定义的声明。
您真正想做的是在编译器的搜索目录中拥有包含文件,然后在json Parser的库库文件中链接到Astvisitor。
分辨率:
首先,我会阻止复制粘贴JSON解析器将文件包含在Clang的Include Directory中。相反,您可以在这里做两件事:
- 将您的包含文件粘贴到一般中,包括
/usr/local/include
等目录 - 将您的包含目录添加到
CPLUS_INCLUDE_PATH
。
完成了包含文件设置后,您将需要从GitHub编译Github的JSON解析器,然后将您的递归视频程序链接到它。
答案
我看到您链接的jsonparser有一个cmakelist文件,如果您只想让它完成工作,这确实很有帮助。
克隆回购后,按照他们所说的来编译库。
mkdir -p build/debug
cd build/debug
cmake -DCMAKE_BUILD_TYPE=debug -DBUILD_STATIC_LIBS=ON -DBUILD_SHARED_LIBS=OFF -DARCHIVE_INSTALL_DIR=. -G "Unix Makefiles" ../..
make
之后,您可以调用sudo make install
,这将在适当的Include Directory中复制Include文件,该目录由您的OS搜索索引,并为编译的库进行相同的操作。在此链接到您的库之后,就像
CFLAGS = `pkg-config --cflags opencv`
LIBS = `pkg-config --libs opencv`
% : %.cpp
g++ $(CFLAGS) $(LIBS) -o $@ $<
如果使用MakeFile来编译ASTVISitor(make ASTvisitor.cpp
)。或
target_link_library(target jsoncpp)
如果您使用cmakelist来编译您的Astvisitor
- 奇怪的结构&GCC&clang(void*返回类型)
- 数据成员SFINAE的C++17测试:gcc vs clang
- 当我编译webrtc服务器时,Windows上只支持clang-cl
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- Clang bug?使用指针作为模板参数
- clang整洁10忽略了我的NOLINT命令
- 如何获取有关在 Clang LibTooling 中调用析构函数的信息?
- 如何多次使用Clang LibTooling
- 使用 Clang LibTooling 扫描C++在模板化父类中调用本地类的源
- 如何使用clang-libtooling获取宏及其扩展
- Clang 3.8 C++ - 使用 LibTooling 读取目录中的所有源文件
- Clang 使用 LibTooling Rewriter 生成新文件
- 如何使用 clang LibTooling 获取函数指针参数名称
- clang libtooling-如何使用依赖关系
- 将JSON库添加到Clang libtooling项目
- CLang Libtooling:在 clang::VarDecl、clang::FieldDecl 或 clang::
- CLang 3.5 LibTooling:获取CLang::VarDecl中变量的文件名
- Clang 工具(libtooling):将标头搜索路径设置为标准 libs 标头.基础框架
- clang-libTooling:如何找到AST项来自哪个标头