Ошибка компиляции файла cpp (ros)

Я работаю над пакетом knowrob и уже написал свою онтологию (файл XML) с помощью Protege. Если я разберу файл owl.file и отправлю несколько запросов, у меня будут правильные ответы. Теперь моя проблема состоит в том, чтобы сделать cpp для анализа моего файла xml. Я уже читал что-то о json_prolog для отправки запросов из моей программы в knowrob, но это слишком запутанно (http://www.knowrob.org/doc/interact_with_knowrob_via_ros). Я создаю свой файл запуска, и он работает, позже, когда я пытаюсь скомпилировать этот файл cpp:

#include <string>
#include <ros/ros.h>
#include <json_prolog/prolog.h>
using namespace std;
using namespace json_prolog;
int main(int argc, char *argv[])
{
    ros::init(argc, argv, "test_json_prolog");
    Prolog pl;
    PrologQueryProxy bdgs = pl.query("member(A, [1, 2, 3, 4]), B = ['x', A],             C = foo(bar, A, B)");

    for(PrologQueryProxy::iterator it=bdgs.begin();

    it != bdgs.end(); it++)
    {
        PrologBindings bdg = *it;
        cout << "Found solution: " << (bool)(it == bdgs.end()) << endl;
        cout << "A = "<< bdg["A"] << endl;
        cout << "B = " << bdg["B"] << endl;
        cout << "C = " << bdg["C"] << endl;
    }
    return 0;
}code here

У меня ошибка:

/tmp/cccLQk3H.o:test_json_prolog.cpp:function main: error: undefined reference to 'ros::init(int&, char**, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int)'

и другие подобные ошибки о неопределенной ссылке.

CMakelist:

cmake_minimum_required(VERSION 2.8.3)
project(json_prolog)
find_package(catkin REQUIRED rosjava_build_tools roscpp rospy json_prolog_msgs)
catkin_rosjava_setup(installApp publishMavenJavaPublicationToMavenRepository writeClasspath)
install(DIRECTORY ${CATKIN_DEVEL_PREFIX}/${CATKIN_GLOBAL_MAVEN_DESTINATION}/org/knowrob/${PROJECT_NAME}/
    DESTINATION ${CATKIN_GLOBAL_MAVEN_DESTINATION}/org/knowrob/${PROJECT_NAME})
catkin_package(INCLUDE_DIRS include LIBRARIES json_prolog CATKIN_DEPENDS json_prolog_msgs )


# find SWI Prolog libraries
include(FindPkgConfig)
pkg_check_modules(SWIPL REQUIRED swipl)
include_directories(${SWIPL_INCLUDE_DIRS})
link_directories(${SWIPL_LIBRARY_DIRS})

# export Python libraries
catkin_python_setup()

# C++ client library

include_directories(include ${catkin_INCLUDE_DIRS})
find_package(PkgConfig)
pkg_check_modules(JSON_GLIB REQUIRED json-glib-1.0)
add_definitions(${JSON_GLIB_CFLAGS})
link_directories(${JSON_GLIB_LIBRARIY_DIRS})

Как я могу это решить?


person Marcello Chiurazzi    schedule 22.05.2015    source источник
comment
Я бы начал с вывода значения catkin_LIBRARIES, чтобы проверить, успешно ли выполнено find_package(). Кроме того, в этой библиотеке, кажется, есть собственный макрос Cmake catkin_package(), и написано, что его нужно вызывать перед передачей какой-либо информации в сборку. Вы звонили?   -  person Baris Demiray    schedule 22.05.2015
comment
нет, думаю нет. Итак, прежде всего: как я могу проверить catkin_LIBRARIES, чтобы распечатать вам результаты? P.S. извините, но я новый пользователь Ubuntu :)   -  person Marcello Chiurazzi    schedule 22.05.2015
comment
Вы можете распечатать его, вызвав message(STATUS ${catkin_LIBRARIES}) в файле CMakeLists.txt.   -  person Baris Demiray    schedule 22.05.2015
comment
может быть, я делаю это неправильно; в терминале в папке, в которой у меня есть CMakeList.txt? В этом случае: bash: синтаксическая ошибка рядом с неожиданным токеном `STATUS'   -  person Marcello Chiurazzi    schedule 22.05.2015
comment
Ах, нет, он должен войти в ваш файл CMakeListst.txt, желательно прямо перед вызовом target_link_libraries(), тогда, когда вы сделаете cmake ., он будет работать с другими командами Cmake.   -  person Baris Demiray    schedule 22.05.2015
comment
Эти строки уже есть в вашем вопросе, вам не нужно вводить их снова. Можете ли вы просто поставить message(STATUS ${catkin_LIBRARIES}) перед вызовом target_link_libraries() и перезапустить Cmake?   -  person Baris Demiray    schedule 22.05.2015
comment
Я думаю, что просто напишу ответ, чтобы было больше места для того, что я имею в виду, и, надеюсь, он будет более ясным.   -  person Baris Demiray    schedule 22.05.2015
comment
хорошо, спасибо, я отредактировал пост с полным CmakeList.txt   -  person Marcello Chiurazzi    schedule 22.05.2015


Ответы (2)


Вы должны начать расследование с проверки того, был ли ваш вызов find_package() (вы позвонили find_package(), верно?) Успешным, поэтому измените фрагмент, который вы добавили в свой вопрос, добавив строку отладки,

message(STATUS ${catkin_LIBRARIES})

add_executable(test_json_prolog examples/test_json_prolog.cpp)
target_link_libraries(test_json_prolog json_prolog ${catkin_LIBRARIES})
add_dependencies(test_json_prolog ${catkin_EXPORTED_TARGETS})

Вызов message должен печатать библиотеки, на которые вы хотели ссылаться.

Кроме того, посмотрите эту страницу, если вы еще этого не сделали, http://wiki.ros.org/catkin/CMakeLists.txt. Там они упоминают пользовательский макрос, который вы ДОЛЖНЫ вызывать, то есть catkin_package(). Кроме того, я думаю, что разделы 6, 7 и 8 связаны с вашей проблемой.

person Baris Demiray    schedule 22.05.2015
comment
хорошо, спасибо, я вставляю message(STATUS ${catkin_LIBRARIES}) Теперь, как я могу это проверить? Если вы хотите, я отредактировал вопрос с предыдущей частью CMakeList. - person Marcello Chiurazzi; 22.05.2015
comment
проблема в том, что когда я запускаю файл, потому что, если я скомпилирую его с помощью g++ -c name.cpp, у меня не будет проблем - person Marcello Chiurazzi; 22.05.2015
comment
Вы должны просто построить свой проект, как обычно. В журналах сборки вы увидите вывод. - person Baris Demiray; 22.05.2015
comment
Это то, что я делаю. Сначала я запускаю свой файл запуска: <launch> <param name="initial_package" type="string" value="knowrob_common" /> <param name="initial_goal" type="string" value="owl_parse('package://knowrob_common/owl/prova0.owl')" /> <node name="json_prolog" pkg="json_prolog" type="json_prolog_node" cwd="node" output="screen" /> </launch>, а затем в другом терминале запускаю свой cpp. файл, но у меня всегда одна и та же ошибка - person Marcello Chiurazzi; 22.05.2015

Вы можете попробовать скомпилировать его напрямую с помощью компилятора g++.

Пожалуйста, проверьте этот ответ: Скомпилируйте roscpp без ros (используя g++)

Там исходный код компилируется без cmake или catkin_make

person Derzu    schedule 07.07.2017