【问题标题】:Error compiling a cpp file (ros)编译 cpp 文件时出错 (ros)
【发布时间】:2015-05-22 08:18:50
【问题描述】:

我正在开发knowrob 包,并且我已经用Protege 编写了我的本体(XML 文件)。 如果我解析 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})

我该如何解决?

【问题讨论】:

  • 我会先打印catkin_LIBRARIES 的值来检查find_package() 是否成功。此外,这个库似乎有一个自定义的 Cmake 宏 catkin_package() 并且它写道必须在将任何信息传递给构建之前调用它。你打电话了吗?
  • 不,我认为不。所以首先:我如何检查 catkin_LIBRARIES 来打印结果?附言抱歉,我是新的 ubuntu 用户 :)
  • 您可以通过在您的 CMakeLists.txt 文件中调用 message(STATUS ${catkin_LIBRARIES}) 来打印它
  • 也许我做错了;在我拥有 CMakeList.txt 的文件夹中的终端中?在这种情况下:bash: syntax error near unexpected token `STATUS'
  • 啊,不,它应该进入你的CMakeListst.txt 文件,最好在target_link_libraries() 调用之前,然后当你调用cmake . 时,它将与其他Cmake 命令一起运行。

标签: c++ json cmake ros


【解决方案1】:

您应该开始调查,检查您对find_package() 的调用(您叫find_package(),对吗?)是否成功,所以通过添加调试行来更改您在问题中添加的sn-p,

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 节也都与您的问题有关。

【讨论】:

  • 好的,谢谢,我插入message(STATUS ${catkin_LIBRARIES}) 现在我该如何检查呢?如果你想要我用 CMakeList 的前一部分编辑问题
  • 问题是当我运行文件时,因为如果我用 g++ -c name.cpp 编译它,我没有问题
  • 您应该像往常一样构建您的项目。在构建日志中,您将看到输出。
  • 这就是我所做的。首先我运行我的启动文件:&lt;launch&gt; &lt;param name="initial_package" type="string" value="knowrob_common" /&gt; &lt;param name="initial_goal" type="string" value="owl_parse('package://knowrob_common/owl/prova0.owl')" /&gt; &lt;node name="json_prolog" pkg="json_prolog" type="json_prolog_node" cwd="node" output="screen" /&gt; &lt;/launch&gt;,然后在另一个终端中运行我的 cpp。文件,但我总是有同样的错误
【解决方案2】:

你可以尝试直接使用g++编译器编译。

请检查这个答案: Compile roscpp without ros (using g++)

有一个源代码是在没有cmake或catkin_make的情况下编译的

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-28
    • 1970-01-01
    • 1970-01-01
    • 2014-02-02
    • 2014-02-07
    • 1970-01-01
    • 2022-11-26
    相关资源
    最近更新 更多