2015-05-22 2 views
1

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

#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}) 

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

+0

Я хотел бы начать с печатью значение 'catkin_LIBRARIES', чтобы проверить, если' find_package() 'был успешным или нет. Кроме того, эта библиотека, похоже, имеет собственный макрос Cmake 'catkin_package()' и написано, что он должен быть вызван перед передачей любой информации в сборку. Вы позвонили? –

+0

нет, я думаю нет. Итак, в первую очередь: как я могу проверить catkin_LIBRARIES, чтобы распечатать результаты? P.S. извините, но я новый пользователь ubuntu :) –

+0

Вы можете распечатать его, вызвав сообщение (STATUS $ {catkin_LIBRARIES}) 'в файле CMakeLists.txt –

ответ

1

Вы должны начать расследование с проверки, если ваш вызов 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 связаны с вашей проблемой, я думаю.

+0

ok Спасибо, я вставляю 'сообщение (STATUS $ {catkin_LIBRARIES})' Теперь, как я могу проверить его? Если вы хотите, чтобы я отредактировал вопрос с предыдущей частью CMakeList –

+0

, проблема в том, что я запускаю файл, потому что, если я скомпилирую его с g ++ -c name.cpp, у меня нет проблем. –

+0

Вы должны просто создать свой проект, поскольку вы обычно делаю. В журналах сборки вы увидите результат. –

0

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

Пожалуйста, проверьте этот ответ: Compile roscpp without ros (using g++)

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