将JSON库添加到Clang libtooling项目

Adding json library to clang libtooling project

本文关键字:Clang libtooling 项目 添加 JSON      更新时间:2023-10-16

我正在使用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中。相反,您可以在这里做两件事:

  1. 将您的包含文件粘贴到一般中,包括 /usr/local/include
  2. 等目录
  3. 将您的包含目录添加到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