Добавление библиотеки json в проект clang libtooling

Я пишу RecursiveASTVisitor, используя clang libtool.

Прямо сейчас я пытаюсь прочитать файл json и загрузил библиотеку json из https://github.com/open-source-parsers/jsoncpp

Я скопировал папку "include/json" в путь к моему проекту "llvm/tools/clang/include"

При компиляции с использованием команды ninja команда include не выдает никаких ошибок 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.

Что я упускаю или должен делать вместо этого??


person Jeremy Kuah    schedule 29.06.2016    source источник


Ответы (1)


При компиляции с использованием команды ninja команда include не выдает никаких ошибок include "json/json.h"

При копировании вставьте файлы заголовков в папку, которая уже находится в пути поиска компилятора. У вас не будет проблем в #include "json/json.h", потому что да, файл есть, и вы еще ничего из него не использовали, так что это просто какая-то функция, объявления классов, которые будут проигнорированы.

Однако, когда я пытаюсь ввести строку кода Json::Value root, возникает ошибка связывания.

Теперь, когда вы написали Json::Value root;, произошло то, что вы вызвали конструктор для Json::Value, который объявлен во включенных заголовочных файлах, но реализован в исходных файлах. Следовательно, компилятор не может найти эту реализацию конструктора и жалуется на это.

Возможно, это сработало, вся библиотека парсера Json была реализована во включенных файлах заголовков. Так как тогда компилятор нашел бы объявление с определением.

То, что вы действительно хотите сделать, это иметь включаемые файлы в каталоге поиска компилятора, а затем скомпилированный библиотечный файл синтаксического анализатора json, который вы связываете с вашим ASTVisitor.

Решение:

Прежде всего, я не рекомендую копировать и вставлять включаемые файлы парсеров json в каталог include в clang. Вместо этого вы можете сделать здесь две вещи:

  1. Вставьте ваши включаемые файлы в общий каталог включаемых файлов, например /usr/local/include.
  2. Добавьте каталог включения в CPLUS_INCLUDE_PATH.

После того, как вы закончите настройку включаемых файлов, вам нужно будет скомпилировать парсер json из github, а затем связать с ним ваш recursiveASTVisitor.

Ответить

Я вижу, что у 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, это скопирует включаемые файлы в соответствующий каталог включения, который индексируется для поиска вашей ОС, а также сделает то же самое для скомпилированной библиотеки. После этого ссылка на вашу библиотеку так же проста, как

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

person Nishant Sharma    schedule 29.06.2016
comment
Я не очень хорошо разбираюсь в статической линковке библиотек. Что вы имеете в виду о CFLAGS, где он должен быть размещен? RecursiveASTVisitor собирается с помощью ninja... будет ли какое-то конкретное место, куда мне нужно будет зайти, чтобы добавить ссылку на библиотеку? - person Jeremy Kuah; 30.06.2016
comment
Я нашел файл CMakeLists.txt в той же папке, что и моя папка ASTVisitor, и добавил target_link_libraries(MyASTChecker jsoncpp), но компиляция говорит мне, что library not found for -ljsoncpp - person Jeremy Kuah; 30.06.2016
comment
Вы можете сделать это двумя способами. Во-первых, target_link_libraries(<target> <path_to_compiled_jsoncpp_library>). Во-вторых, создайте jsoncpp, а затем вызовите sudo make install в папке jsoncpp, это будет не вся библиотека jsoncpp, и тогда ваш текущий файл CMakeList сможет ее найти. - person Nishant Sharma; 30.06.2016