Я пишу 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.
Что я пропускаю или должен вместо этого делать ??
При компиляции с использованием команды ninja команда include не выдает никакой ошибки
include "json/json.h"
При копировании вставьте файлы заголовков в папку, которая уже находится в пути поиска компилятора. Вы не получите проблем в #include "json/json.h"
потому что да, файл есть, а вы еще ничего не использовали, так что это просто какая-то функция, объявления классов, которые будут игнорироваться.
Однако, когда я пытаюсь ввести строку кода Json :: Value root, он выдает ошибку компоновки.
Теперь, когда написал Json::Value root;
случилось то, что вы вызвали конструктор для Json::Value
который объявлен во включенных заголовочных файлах, но реализован в исходных файлах. Следовательно, компилятор не может найти эту реализацию конструктора и жалуется на это.
Возможно, сработала вся библиотека анализатора Json, реализованная во включенных заголовочных файлах. Как тогда, компилятор нашел бы объявление с определением.
Что вы действительно хотите сделать, так это иметь включаемые файлы в каталоге поиска компилятора, а затем скомпилированный библиотечный файл анализатора json, который вы связываете с вашим ASTVisitor.
Разрешение:
Прежде всего, я буду препятствовать вставке копий включаемых файлов парсера json в каталог включения clang. Вместо этого вы можете сделать две вещи здесь:
/usr/local/include
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
Других решений пока нет …