php_lang_ref:Language Reference >> Generators >> Generator syntax

本文深入探讨PHP中的生成器概念及其实现方式,包括基本语法、使用案例和高级特性,如从数组或对象获取值。
<?php
// +----------------------------------------------------------------------
// | Created by activity.
// +----------------------------------------------------------------------
// | Language Reference >> Generators >> Generator syntax
// +----------------------------------------------------------------------
// | Author: alexander <gt199899@gmail.com>
// +----------------------------------------------------------------------
// | Datetime: 2017-07-14 16:46
// +----------------------------------------------------------------------
// | Perfect Is Shit
// +----------------------------------------------------------------------


/**
 * 生成器的主要目的就是实现对象迭代,并且比定义类实现Iterator接口的方式降低了开销和复杂性;
 * 生成器函数与普通的函数不同,普通的函数仅仅返回一次结果,而生成器函数可以根据需要yield多次(可以看做返回多次);
 * Generator对象是一个实现Iterator接口的类,但是这个类不能实例化,由生成器函数返回;
 * case1:生成器函数返回的是一个Generator对象;
 * case2:yield会返回一个值给循环调用此生成器的代码;
 * case3:生成器函数被调用一次,就返回一个按顺序取到的yield的值,并且暂停执行,直到下次被调用;
 * case4:可以指定键名来生成值;
 * case5:yield可以在没有参数传入的情况下被调用来生成一个NULL值并配对一个自动的键名;
 * case6:使用引用来生成值;
 * case7:PHP7中,yield可以通过from关键字,从别的生成器,数组或者Traversable object中获取返回值;
 * case8:生成器中不能返回值,否则产生一个错误(PHP7中不会,和return空一样的效果),但是return空是一个有效的语法并且会终止生成器继续执行;
 * case9:生成器返回的是Generator对象,可以使用Generator对象的方法来控制生成器;
 */

namespace case1;
function xrange($start, $limit, $step = 1)
{
    for ($i = $start; $i <= $limit; $i += $step) {
        yield $i;
    }
}

$object = xrange(1, 1000);
var_dump($object);
var_dump($object instanceof Iterator);
/**
 * 输出:
 * class Generator#1 (0) {
 * }
 * bool(true)
 */

namespace case2;
function gen_one_to_three()
{
    for ($i = 1; $i <= 3; $i++) {
        //注意变量$i的值在不同的yield之间是保持传递的。
        yield $i;
    }
}

foreach (gen_one_to_three() as $value) {
    echo "$value\n";
}
/**
 * 输出:
 * 1
 * 2
 * 3
 */

namespace case3;
function mul_yield()
{
    $ii = 1;
    for ($i = 1; $i <= 15; $i += 3) {
        yield "生成器内循环次数" . $ii;
        yield $i;
        yield $i + 1;
        yield $i + 2;
        $ii++;
    }
}

$i = 0;
$times = 1;
foreach (mul_yield() as $value) {
    if ($i >= $times) break;
    echo($value . "\n");
    $i++;
}
/**
 * 这里每当mul_yield生成器函数被调用一次,返回的是yield返回的值,并且暂停;
 * 注意并不是mul_yield被调用一次,将函数体执行一遍,仅仅是按顺序把yield返回到值输出;
 *
 * $times = 1 输出:
 * 生成器内循环次数1
 *
 * $times = 2 输出:
 * 生成器内循环次数1
 * 1
 *
 * $times = 15 输出:
 * 生成器内循环次数1
 * 1
 * 2
 * 3
 * 生成器内循环次数2
 * 4
 * 5
 * 6
 * 生成器内循环次数3
 * 7
 * 8
 * 9
 * 生成器内循环次数4
 * 10
 * 11
 */

namespace case4;
$input = <<<'EOF'
1;PHP;Likes dollar signs
2;Python;Likes whitespace
3;Ruby;Likes blocks
EOF;

function input_parser($input)
{
    foreach (explode("\n", $input) as $line) {
        $fields = explode(';', $line);
        $id = array_shift($fields);

        yield $id => $fields;
    }
}

foreach (input_parser($input) as $id => $fields) {
    echo "$id:\n";
    echo "    $fields[0]\n";
    echo "    $fields[1]\n";
}
// 输出:
//1:
//    PHP
//    Likes dollar signs
//2:
//    Python
//    Likes whitespace
//3:
//    Ruby
//    Likes blocks

namespace case5;
function gen_three_nulls()
{
    foreach (range(1, 3) as $i) {
        yield;
    }
}

var_dump(iterator_to_array(gen_three_nulls()));
// 输出:
//array(3) {
//        [0] =>
//  NULL
//  [1] =>
//  NULL
//  [2] =>
//  NULL
//}

namespace case6;
function &gen_reference()
{
    $value = 3;

    while ($value > 0) {
        yield $value;
    }
}

/*
 * 我们可以在循环中修改$number的值,而生成器是使用的引用值来生成,所以gen_reference()内部的$value值也会跟着变化。
 */
foreach (gen_reference() as &$number) {
    echo (--$number) . '... ';
}
/**
 * 输出:
 * 2... 1... 0...
 */

namespace case7;
function count_to_ten()
{
    yield 1;
    yield 2;
    yield from [3, 4];
    yield from new \ArrayIterator([5, 6]);
    yield from seven_eight();
    yield 9;
    yield 10;
}

function seven_eight()
{
    yield 7;
    yield from eight();
}

function eight()
{
    yield 8;
}

foreach (count_to_ten() as $num) {
    echo "$num ";
}
/**
 * 输出:
 * 1 2 3 4 5 6 7 8 9 10
 */

namespace case8;
function one_three()
{
    for ($i = 1; $i <= 3; $i++) {
        yield $i;
        if ($i == 2) return;
    }
}
foreach (one_three() as $value) {
    echo $value . " ";
}
/**
 * 输出:
 * 1 2
 */
function one_four()
{
    for ($i = 1; $i <= 4; $i++) {
        yield $i;
        return $i;
    }
}
$gen = one_four();
foreach ($gen as $value) {
    echo $value . " ";
}
echo $gen->getReturn();
/**
 * 手册上说生成器函数不能有返回值,否则会产生一个编译错误;
 * 但是PHP7这里返回值了之后,效果和返回空一样都是终止执行,并没有报错;
 * 使用getReturn()方法可以获取返回值;
 * 输出:
 * 1 1
 */

namespace case9;
function one_four()
{
    for ($i = 1; $i <= 4; $i++) {
        yield $i;
    }
}
$gen = one_four();
while (1) {
    $current = $gen->current();
    // 迭代器中没有值,返回空则终止循环
    if(!$current){
        break;
    }
    echo $current . " ";
    $gen->next();
}
/**
 * 输出:
 * 1 2 3 4
 */
robot-nanjing@robotnanjing-QiTianM430-N000:~/mytest/gripper_ws$ catkin_make Base path: /home/robot-nanjing/mytest/gripper_ws Source space: /home/robot-nanjing/mytest/gripper_ws/src Build space: /home/robot-nanjing/mytest/gripper_ws/build Devel space: /home/robot-nanjing/mytest/gripper_ws/devel Install space: /home/robot-nanjing/mytest/gripper_ws/install #### #### Running command: "cmake /home/robot-nanjing/mytest/gripper_ws/src -DCATKIN_DEVEL_PREFIX=/home/robot-nanjing/mytest/gripper_ws/devel -DCMAKE_INSTALL_PREFIX=/home/robot-nanjing/mytest/gripper_ws/install -G Unix Makefiles" in "/home/robot-nanjing/mytest/gripper_ws/build" #### -- The C compiler identification is GNU 9.4.0 -- The CXX compiler identification is GNU 9.4.0 -- Check for working C compiler: /usr/bin/cc -- Check for working C compiler: /usr/bin/cc -- works -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Detecting C compile features -- Detecting C compile features - done -- Check for working CXX compiler: /usr/bin/c++ -- Check for working CXX compiler: /usr/bin/c++ -- works -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Detecting CXX compile features -- Detecting CXX compile features - done -- Using CATKIN_DEVEL_PREFIX: /home/robot-nanjing/mytest/gripper_ws/devel -- Using CMAKE_PREFIX_PATH: /opt/ros/noetic -- This workspace overlays: /opt/ros/noetic -- Found PythonInterp: /usr/bin/python3 (found suitable version "3.8.10", minimum required is "3") -- Using PYTHON_EXECUTABLE: /usr/bin/python3 -- Using Debian Python package layout -- Found PY_em: /usr/lib/python3/dist-packages/em.py -- Using empy: /usr/lib/python3/dist-packages/em.py -- Using CATKIN_ENABLE_TESTING: ON -- Call enable_testing() -- Using CATKIN_TEST_RESULTS_DIR: /home/robot-nanjing/mytest/gripper_ws/build/test_results -- Forcing gtest/gmock from source, though one was otherwise available. -- Found gtest sources under '/usr/src/googletest': gtests will be built -- Found gmock sources under '/usr/src/googletest': gmock will be built -- Found PythonInterp: /usr/bin/python3 (found version "3.8.10") -- Found Threads: TRUE -- Using Python nosetests: /usr/bin/nosetests3 -- catkin 0.8.12 -- BUILD_SHARED_LIBS is on -- BUILD_SHARED_LIBS is on -- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- ~~ traversing 1 packages in topological order: -- ~~ - ssp_gripper -- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- +++ processing catkin package: 'ssp_gripper' -- ==> add_subdirectory(ssp_gripper) -- Using these message generators: gencpp;geneus;genlisp;gennodejs;genpy -- Check if compiler accepts -pthread -- Check if compiler accepts -pthread - yes -- Generating .msg files for action ssp_gripper/Grasp /home/robot-nanjing/mytest/gripper_ws/src/ssp_gripper/action/Grasp.action Generating for action Grasp -- Generating .msg files for action ssp_gripper/Homing /home/robot-nanjing/mytest/gripper_ws/src/ssp_gripper/action/Homing.action Generating for action Homing -- Generating .msg files for action ssp_gripper/Stop /home/robot-nanjing/mytest/gripper_ws/src/ssp_gripper/action/Stop.action Generating for action Stop -- Generating .msg files for action ssp_gripper/Move /home/robot-nanjing/mytest/gripper_ws/src/ssp_gripper/action/Move.action Generating for action Move -- ssp_gripper: 29 messages, 0 services -- === ENTER add example_state === -- === LEAVE add example_state === -- Found GTest: /usr/lib/x86_64-linux-gnu/libgtest.a -- Configuring done WARNING: Target "example_state" requests linking to directory "/home/robot-nanjing/aubo_sdk-0.26.0-rc.1-Linux_x86_64+ce93216/lib". Targets may link only to libraries. CMake is dropping the item. -- Generating done -- Build files have been written to: /home/robot-nanjing/mytest/gripper_ws/build #### #### Running command: "make -j16 -l16" in "/home/robot-nanjing/mytest/gripper_ws/build" #### Scanning dependencies of target _ssp_gripper_generate_messages_check_deps_GraspEpsilon Scanning dependencies of target _ssp_gripper_generate_messages_check_deps_MoveGoal Scanning dependencies of target _ssp_gripper_generate_messages_check_deps_MoveActionFeedback Scanning dependencies of target _ssp_gripper_generate_messages_check_deps_HomingGoal Scanning dependencies of target sensor_msgs_generate_messages_lisp Scanning dependencies of target _ssp_gripper_generate_messages_check_deps_MoveActionResult Scanning dependencies of target _ssp_gripper_generate_messages_check_deps_MoveAction Scanning dependencies of target _ssp_gripper_generate_messages_check_deps_StopResult Scanning dependencies of target _ssp_gripper_generate_messages_check_deps_StopGoal Scanning dependencies of target _ssp_gripper_generate_messages_check_deps_StopActionFeedback Scanning dependencies of target _ssp_gripper_generate_messages_check_deps_StopAction Scanning dependencies of target _ssp_gripper_generate_messages_check_deps_MoveFeedback Scanning dependencies of target _ssp_gripper_generate_messages_check_deps_MoveResult Scanning dependencies of target actionlib_msgs_generate_messages_py Scanning dependencies of target _ssp_gripper_generate_messages_check_deps_HomingResult Scanning dependencies of target _ssp_gripper_generate_messages_check_deps_StopFeedback [ 0%] Built target sensor_msgs_generate_messages_lisp [ 0%] Built target actionlib_msgs_generate_messages_py Scanning dependencies of target _ssp_gripper_generate_messages_check_deps_MoveActionGoal [ 0%] Built target _ssp_gripper_generate_messages_check_deps_HomingGoal [ 0%] Built target _ssp_gripper_generate_messages_check_deps_MoveAction Scanning dependencies of target _ssp_gripper_generate_messages_check_deps_GraspResult [ 0%] Built target _ssp_gripper_generate_messages_check_deps_MoveGoal [ 0%] Built target _ssp_gripper_generate_messages_check_deps_MoveActionResult Scanning dependencies of target _ssp_gripper_generate_messages_check_deps_GraspAction [ 0%] Built target _ssp_gripper_generate_messages_check_deps_GraspEpsilon [ 0%] Built target _ssp_gripper_generate_messages_check_deps_StopAction [ 0%] Built target _ssp_gripper_generate_messages_check_deps_HomingResult [ 0%] Built target _ssp_gripper_generate_messages_check_deps_MoveResult [ 0%] Built target _ssp_gripper_generate_messages_check_deps_StopResult [ 0%] Built target _ssp_gripper_generate_messages_check_deps_StopActionFeedback Scanning dependencies of target _ssp_gripper_generate_messages_check_deps_GraspActionResult [ 0%] Built target _ssp_gripper_generate_messages_check_deps_MoveActionFeedback [ 0%] Built target _ssp_gripper_generate_messages_check_deps_MoveFeedback [ 0%] Built target _ssp_gripper_generate_messages_check_deps_StopFeedback Scanning dependencies of target _ssp_gripper_generate_messages_check_deps_GraspActionGoal Scanning dependencies of target _ssp_gripper_generate_messages_check_deps_HomingActionFeedback Scanning dependencies of target _ssp_gripper_generate_messages_check_deps_HomingAction Scanning dependencies of target _ssp_gripper_generate_messages_check_deps_HomingActionGoal Scanning dependencies of target _ssp_gripper_generate_messages_check_deps_GraspFeedback Scanning dependencies of target _ssp_gripper_generate_messages_check_deps_GraspGoal Scanning dependencies of target _ssp_gripper_generate_messages_check_deps_HomingFeedback Scanning dependencies of target _ssp_gripper_generate_messages_check_deps_StopActionResult Scanning dependencies of target _ssp_gripper_generate_messages_check_deps_StopActionGoal Scanning dependencies of target _ssp_gripper_generate_messages_check_deps_HomingActionResult Scanning dependencies of target _ssp_gripper_generate_messages_check_deps_GraspActionFeedback [ 0%] Built target _ssp_gripper_generate_messages_check_deps_MoveActionGoal [ 0%] Built target _ssp_gripper_generate_messages_check_deps_StopGoal Scanning dependencies of target actionlib_msgs_generate_messages_lisp Scanning dependencies of target actionlib_msgs_generate_messages_eus [ 0%] Built target actionlib_msgs_generate_messages_lisp [ 0%] Built target actionlib_msgs_generate_messages_eus [ 0%] Built target _ssp_gripper_generate_messages_check_deps_GraspResult [ 0%] Built target _ssp_gripper_generate_messages_check_deps_GraspAction [ 0%] Built target _ssp_gripper_generate_messages_check_deps_HomingActionFeedback Scanning dependencies of target actionlib_msgs_generate_messages_cpp [ 0%] Built target _ssp_gripper_generate_messages_check_deps_GraspActionResult [ 0%] Built target _ssp_gripper_generate_messages_check_deps_GraspActionGoal Scanning dependencies of target geometry_msgs_generate_messages_eus Scanning dependencies of target std_msgs_generate_messages_nodejs [ 0%] Built target actionlib_msgs_generate_messages_cpp [ 0%] Built target _ssp_gripper_generate_messages_check_deps_GraspFeedback [ 0%] Built target _ssp_gripper_generate_messages_check_deps_HomingActionGoal Scanning dependencies of target rosgraph_msgs_generate_messages_nodejs [ 0%] Built target _ssp_gripper_generate_messages_check_deps_HomingFeedback Scanning dependencies of target actionlib_generate_messages_cpp [ 0%] Built target _ssp_gripper_generate_messages_check_deps_HomingAction [ 0%] Built target _ssp_gripper_generate_messages_check_deps_StopActionResult Scanning dependencies of target geometry_msgs_generate_messages_cpp Scanning dependencies of target control_msgs_generate_messages_py [ 0%] Built target _ssp_gripper_generate_messages_check_deps_GraspActionFeedback [ 0%] Built target _ssp_gripper_generate_messages_check_deps_HomingActionResult [ 0%] Built target _ssp_gripper_generate_messages_check_deps_StopActionGoal [ 0%] Built target std_msgs_generate_messages_nodejs [ 0%] Built target geometry_msgs_generate_messages_eus Scanning dependencies of target control_msgs_generate_messages_cpp Scanning dependencies of target std_msgs_generate_messages_py [ 0%] Built target rosgraph_msgs_generate_messages_nodejs Scanning dependencies of target roscpp_generate_messages_cpp Scanning dependencies of target control_msgs_generate_messages_eus [ 0%] Built target actionlib_generate_messages_cpp Scanning dependencies of target trajectory_msgs_generate_messages_nodejs Scanning dependencies of target actionlib_generate_messages_nodejs [ 0%] Built target geometry_msgs_generate_messages_cpp [ 0%] Built target control_msgs_generate_messages_py Scanning dependencies of target std_msgs_generate_messages_lisp Scanning dependencies of target trajectory_msgs_generate_messages_eus Scanning dependencies of target geometry_msgs_generate_messages_lisp Scanning dependencies of target roscpp_generate_messages_py [ 0%] Built target control_msgs_generate_messages_cpp [ 0%] Built target std_msgs_generate_messages_py Scanning dependencies of target roscpp_generate_messages_nodejs Scanning dependencies of target std_msgs_generate_messages_cpp [ 0%] Built target _ssp_gripper_generate_messages_check_deps_GraspGoal [ 0%] Built target roscpp_generate_messages_cpp Scanning dependencies of target actionlib_msgs_generate_messages_nodejs [ 0%] Built target control_msgs_generate_messages_eus [ 0%] Built target trajectory_msgs_generate_messages_nodejs [ 0%] Built target actionlib_generate_messages_nodejs [ 0%] Built target std_msgs_generate_messages_lisp [ 0%] Built target roscpp_generate_messages_py [ 0%] Built target geometry_msgs_generate_messages_lisp [ 0%] Built target trajectory_msgs_generate_messages_eus Scanning dependencies of target rosgraph_msgs_generate_messages_eus Scanning dependencies of target std_msgs_generate_messages_eus Scanning dependencies of target trajectory_msgs_generate_messages_cpp Scanning dependencies of target actionlib_generate_messages_py [ 0%] Built target roscpp_generate_messages_nodejs [ 0%] Built target std_msgs_generate_messages_cpp Scanning dependencies of target rosgraph_msgs_generate_messages_lisp Scanning dependencies of target roscpp_generate_messages_eus Scanning dependencies of target control_msgs_generate_messages_nodejs [ 0%] Built target actionlib_msgs_generate_messages_nodejs Scanning dependencies of target roscpp_generate_messages_lisp Scanning dependencies of target actionlib_generate_messages_lisp Scanning dependencies of target sensor_msgs_generate_messages_py Scanning dependencies of target geometry_msgs_generate_messages_nodejs Scanning dependencies of target geometry_msgs_generate_messages_py Scanning dependencies of target rosgraph_msgs_generate_messages_py [ 0%] Built target rosgraph_msgs_generate_messages_eus [ 0%] Built target std_msgs_generate_messages_eus [ 0%] Built target actionlib_generate_messages_py Scanning dependencies of target trajectory_msgs_generate_messages_lisp [ 0%] Built target trajectory_msgs_generate_messages_cpp Scanning dependencies of target actionlib_generate_messages_eus [ 0%] Built target geometry_msgs_generate_messages_py Scanning dependencies of target rosgraph_msgs_generate_messages_cpp [ 0%] Built target roscpp_generate_messages_eus [ 0%] Built target rosgraph_msgs_generate_messages_lisp [ 0%] Built target actionlib_generate_messages_lisp [ 0%] Built target control_msgs_generate_messages_nodejs [ 0%] Built target roscpp_generate_messages_lisp [ 0%] Built target geometry_msgs_generate_messages_nodejs [ 0%] Built target rosgraph_msgs_generate_messages_py [ 0%] Built target sensor_msgs_generate_messages_py Scanning dependencies of target sensor_msgs_generate_messages_cpp Scanning dependencies of target trajectory_msgs_generate_messages_py [ 0%] Built target trajectory_msgs_generate_messages_lisp Scanning dependencies of target sensor_msgs_generate_messages_eus Scanning dependencies of target sensor_msgs_generate_messages_nodejs [ 0%] Built target rosgraph_msgs_generate_messages_cpp [ 0%] Built target actionlib_generate_messages_eus Scanning dependencies of target example_state Scanning dependencies of target control_msgs_generate_messages_lisp [ 0%] Built target sensor_msgs_generate_messages_cpp Scanning dependencies of target ssp_gripper_generate_messages_eus [ 0%] Built target sensor_msgs_generate_messages_nodejs [ 0%] Built target trajectory_msgs_generate_messages_py Scanning dependencies of target ssp_gripper_generate_messages_lisp [ 0%] Built target sensor_msgs_generate_messages_eus Scanning dependencies of target ssp_gripper_generate_messages_nodejs Scanning dependencies of target ssp_gripper_generate_messages_cpp Scanning dependencies of target ssp_gripper_generate_messages_py [ 0%] Built target control_msgs_generate_messages_lisp [ 1%] Building CXX object ssp_gripper/CMakeFiles/example_state.dir/src/example_state.cpp.o [ 1%] Generating EusLisp code from ssp_gripper/GraspGoal.msg [ 1%] Generating EusLisp code from ssp_gripper/GraspResult.msg [ 1%] Generating EusLisp code from ssp_gripper/GraspActionResult.msg [ 1%] Generating EusLisp code from ssp_gripper/GraspAction.msg [ 4%] Generating Lisp code from ssp_gripper/GraspActionGoal.msg [ 6%] Generating EusLisp code from ssp_gripper/HomingAction.msg [ 6%] Generating EusLisp code from ssp_gripper/GraspFeedback.msg [ 6%] Generating Lisp code from ssp_gripper/GraspAction.msg [ 6%] Generating EusLisp code from ssp_gripper/GraspActionGoal.msg [ 6%] Generating Javascript code from ssp_gripper/GraspAction.msg [ 6%] Generating EusLisp code from ssp_gripper/GraspActionFeedback.msg [ 7%] Generating EusLisp code from ssp_gripper/HomingActionGoal.msg [ 9%] Generating C++ code from ssp_gripper/GraspAction.msg [ 9%] Generating Python from MSG ssp_gripper/GraspAction [ 10%] Generating Javascript code from ssp_gripper/GraspActionGoal.msg [ 11%] Generating Javascript code from ssp_gripper/GraspActionFeedback.msg [ 11%] Generating Javascript code from ssp_gripper/GraspActionResult.msg [ 11%] Generating Lisp code from ssp_gripper/GraspActionResult.msg [ 12%] Generating Javascript code from ssp_gripper/GraspGoal.msg [ 12%] Generating Javascript code from ssp_gripper/GraspResult.msg [ 15%] Generating Lisp code from ssp_gripper/GraspResult.msg [ 15%] Generating Lisp code from ssp_gripper/GraspActionFeedback.msg [ 15%] Generating Lisp code from ssp_gripper/GraspGoal.msg [ 15%] Generating Lisp code from ssp_gripper/GraspFeedback.msg [ 17%] Generating Lisp code from ssp_gripper/HomingAction.msg [ 17%] Generating Lisp code from ssp_gripper/HomingActionGoal.msg [ 18%] Generating Javascript code from ssp_gripper/GraspFeedback.msg [ 18%] Generating EusLisp code from ssp_gripper/HomingActionResult.msg [ 18%] Generating Javascript code from ssp_gripper/HomingAction.msg [ 18%] Generating C++ code from ssp_gripper/GraspActionGoal.msg [ 18%] Generating Lisp code from ssp_gripper/HomingActionResult.msg [ 19%] Generating Javascript code from ssp_gripper/HomingActionGoal.msg [ 20%] Generating EusLisp code from ssp_gripper/HomingActionFeedback.msg [ 21%] Generating Lisp code from ssp_gripper/HomingActionFeedback.msg [ 21%] Generating Python from MSG ssp_gripper/GraspActionGoal [ 21%] Generating EusLisp code from ssp_gripper/HomingGoal.msg [ 23%] Generating C++ code from ssp_gripper/GraspActionResult.msg [ 23%] Generating EusLisp code from ssp_gripper/HomingResult.msg [ 24%] Generating C++ code from ssp_gripper/GraspActionFeedback.msg [ 24%] Generating Lisp code from ssp_gripper/HomingGoal.msg [ 24%] Generating Javascript code from ssp_gripper/HomingActionResult.msg [ 24%] Generating C++ code from ssp_gripper/GraspGoal.msg [ 25%] Generating Python from MSG ssp_gripper/GraspActionResult [ 25%] Generating Python from MSG ssp_gripper/GraspActionFeedback [ 26%] Generating Python from MSG ssp_gripper/GraspGoal [ 27%] Generating EusLisp code from ssp_gripper/HomingFeedback.msg [ 27%] Generating Lisp code from ssp_gripper/HomingResult.msg [ 29%] Generating Javascript code from ssp_gripper/HomingActionFeedback.msg [ 29%] Generating Lisp code from ssp_gripper/HomingFeedback.msg [ 29%] Generating Javascript code from ssp_gripper/HomingGoal.msg [ 29%] Generating Python from MSG ssp_gripper/GraspResult [ 30%] Generating EusLisp code from ssp_gripper/StopAction.msg [ 31%] Generating Python from MSG ssp_gripper/GraspFeedback [ 32%] Generating Python from MSG ssp_gripper/HomingAction [ 33%] Generating Lisp code from ssp_gripper/StopAction.msg [ 33%] Generating Python from MSG ssp_gripper/HomingActionGoal [ 34%] Generating C++ code from ssp_gripper/GraspResult.msg [ 35%] Generating Javascript code from ssp_gripper/HomingResult.msg [ 35%] Generating C++ code from ssp_gripper/GraspFeedback.msg [ 36%] Generating EusLisp code from ssp_gripper/StopActionGoal.msg [ 36%] Generating Lisp code from ssp_gripper/StopActionGoal.msg [ 37%] Generating C++ code from ssp_gripper/HomingAction.msg [ 37%] Generating C++ code from ssp_gripper/HomingActionGoal.msg [ 38%] Generating Python from MSG ssp_gripper/HomingActionResult [ 39%] Generating Python from MSG ssp_gripper/HomingActionFeedback [ 39%] Generating Javascript code from ssp_gripper/HomingFeedback.msg [ 40%] Generating Lisp code from ssp_gripper/StopActionResult.msg [ 40%] Generating EusLisp code from ssp_gripper/StopActionResult.msg [ 41%] Generating Python from MSG ssp_gripper/HomingGoal [ 43%] Generating EusLisp code from ssp_gripper/StopActionFeedback.msg [ 43%] Generating EusLisp code from ssp_gripper/StopGoal.msg [ 43%] Generating Python from MSG ssp_gripper/HomingResult [ 43%] Generating Javascript code from ssp_gripper/StopAction.msg [ 44%] Generating Lisp code from ssp_gripper/StopActionFeedback.msg [ 45%] Generating Javascript code from ssp_gripper/StopActionGoal.msg [ 46%] Generating C++ code from ssp_gripper/HomingActionResult.msg [ 46%] Generating Python from MSG ssp_gripper/StopAction [ 47%] Generating EusLisp code from ssp_gripper/StopResult.msg [ 48%] Generating Python from MSG ssp_gripper/HomingFeedback [ 48%] Generating Javascript code from ssp_gripper/StopActionResult.msg [ 49%] Generating Python from MSG ssp_gripper/StopActionGoal [ 50%] Generating Lisp code from ssp_gripper/StopGoal.msg [ 50%] Generating Lisp code from ssp_gripper/StopResult.msg [ 50%] Generating Lisp code from ssp_gripper/StopFeedback.msg [ 51%] Generating Lisp code from ssp_gripper/MoveActionGoal.msg [ 51%] Generating Lisp code from ssp_gripper/MoveAction.msg [ 52%] Generating Javascript code from ssp_gripper/StopActionFeedback.msg [ 53%] Generating Python from MSG ssp_gripper/StopActionResult [ 54%] Generating Lisp code from ssp_gripper/MoveActionFeedback.msg [ 55%] Generating Lisp code from ssp_gripper/MoveActionResult.msg [ 55%] Generating Lisp code from ssp_gripper/MoveGoal.msg [ 55%] Generating EusLisp code from ssp_gripper/StopFeedback.msg [ 55%] Generating Javascript code from ssp_gripper/StopGoal.msg [ 56%] Generating EusLisp code from ssp_gripper/MoveAction.msg [ 56%] Generating Python from MSG ssp_gripper/StopActionFeedback [ 58%] Generating Javascript code from ssp_gripper/StopResult.msg [ 58%] Generating C++ code from ssp_gripper/HomingActionFeedback.msg [ 59%] Generating Python from MSG ssp_gripper/StopGoal [ 60%] Generating Lisp code from ssp_gripper/MoveResult.msg [ 60%] Generating Lisp code from ssp_gripper/MoveFeedback.msg [ 60%] Generating Python from MSG ssp_gripper/StopResult [ 61%] Generating Lisp code from ssp_gripper/GraspEpsilon.msg [ 62%] Generating Python from MSG ssp_gripper/StopFeedback [ 63%] Generating Javascript code from ssp_gripper/StopFeedback.msg [ 63%] Generating Python from MSG ssp_gripper/MoveAction [ 64%] Generating EusLisp code from ssp_gripper/MoveActionGoal.msg [ 64%] Generating Javascript code from ssp_gripper/MoveAction.msg [ 66%] Generating Python from MSG ssp_gripper/MoveActionGoal [ 66%] Generating Javascript code from ssp_gripper/MoveActionGoal.msg [ 66%] Built target ssp_gripper_generate_messages_lisp [ 66%] Generating Javascript code from ssp_gripper/MoveActionResult.msg [ 67%] Generating Javascript code from ssp_gripper/MoveActionFeedback.msg [ 67%] Generating Javascript code from ssp_gripper/MoveGoal.msg [ 67%] Generating EusLisp code from ssp_gripper/MoveActionResult.msg [ 67%] Generating Javascript code from ssp_gripper/MoveFeedback.msg [ 68%] Generating Javascript code from ssp_gripper/MoveResult.msg [ 72%] Generating C++ code from ssp_gripper/HomingGoal.msg [ 72%] Generating Python from MSG ssp_gripper/MoveActionResult [ 72%] Generating C++ code from ssp_gripper/HomingResult.msg [ 73%] Generating EusLisp code from ssp_gripper/MoveActionFeedback.msg [ 74%] Generating Javascript code from ssp_gripper/GraspEpsilon.msg [ 74%] Generating C++ code from ssp_gripper/HomingFeedback.msg [ 74%] Generating Python from MSG ssp_gripper/MoveActionFeedback [ 75%] Generating Python from MSG ssp_gripper/MoveGoal [ 75%] Generating Python from MSG ssp_gripper/MoveResult [ 77%] Generating Python from MSG ssp_gripper/MoveFeedback [ 77%] Generating C++ code from ssp_gripper/StopAction.msg [ 77%] Generating Python from MSG ssp_gripper/GraspEpsilon [ 77%] Built target ssp_gripper_generate_messages_nodejs [ 77%] Generating EusLisp code from ssp_gripper/MoveGoal.msg [ 77%] Generating C++ code from ssp_gripper/StopActionGoal.msg [ 78%] Generating EusLisp code from ssp_gripper/MoveResult.msg [ 79%] Generating C++ code from ssp_gripper/StopActionResult.msg [ 79%] Generating C++ code from ssp_gripper/StopActionFeedback.msg [ 80%] Linking CXX executable /home/robot-nanjing/mytest/gripper_ws/devel/lib/ssp_gripper/example_state [ 81%] Generating C++ code from ssp_gripper/StopGoal.msg [ 82%] Generating C++ code from ssp_gripper/StopResult.msg [ 82%] Generating EusLisp code from ssp_gripper/MoveFeedback.msg [ 83%] Generating EusLisp code from ssp_gripper/GraspEpsilon.msg [ 83%] Generating C++ code from ssp_gripper/StopFeedback.msg [ 83%] Generating EusLisp manifest code for ssp_gripper [ 84%] Generating C++ code from ssp_gripper/MoveAction.msg [ 86%] Generating C++ code from ssp_gripper/MoveActionGoal.msg [ 86%] Generating C++ code from ssp_gripper/MoveActionResult.msg [ 86%] Generating C++ code from ssp_gripper/MoveActionFeedback.msg [ 87%] Generating C++ code from ssp_gripper/MoveGoal.msg [ 87%] Generating C++ code from ssp_gripper/MoveResult.msg [ 88%] Generating C++ code from ssp_gripper/MoveFeedback.msg [ 89%] Generating C++ code from ssp_gripper/GraspEpsilon.msg /usr/bin/ld: CMakeFiles/example_state.dir/src/example_state.cpp.o: in function `exampleState(std::shared_ptr<arcs::aubo_sdk::RpcClient>)': example_state.cpp:(.text+0x65): undefined reference to `arcs::common_interface::AuboApi::getRobotNames[abi:cxx11]()' /usr/bin/ld: example_state.cpp:(.text+0xc3): undefined reference to `arcs::common_interface::AuboApi::getRobotInterface(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' /usr/bin/ld: example_state.cpp:(.text+0xe7): undefined reference to `arcs::common_interface::RobotInterface::getRobotState()' /usr/bin/ld: example_state.cpp:(.text+0xfe): undefined reference to `arcs::common_interface::RobotState::getRobotModeType()' /usr/bin/ld: example_state.cpp:(.text+0x188): undefined reference to `arcs::common_interface::AuboApi::getRobotInterface(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' /usr/bin/ld: example_state.cpp:(.text+0x1ac): undefined reference to `arcs::common_interface::RobotInterface::getRobotState()' /usr/bin/ld: example_state.cpp:(.text+0x1c3): undefined reference to `arcs::common_interface::RobotState::getSafetyModeType()' /usr/bin/ld: example_state.cpp:(.text+0x24d): undefined reference to `arcs::common_interface::AuboApi::getRobotInterface(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' /usr/bin/ld: example_state.cpp:(.text+0x271): undefined reference to `arcs::common_interface::RobotInterface::getRobotState()' /usr/bin/ld: example_state.cpp:(.text+0x288): undefined reference to `arcs::common_interface::RobotState::isSteady()' /usr/bin/ld: example_state.cpp:(.text+0x326): undefined reference to `arcs::common_interface::AuboApi::getRobotInterface(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' /usr/bin/ld: example_state.cpp:(.text+0x34a): undefined reference to `arcs::common_interface::RobotInterface::getRobotState()' /usr/bin/ld: example_state.cpp:(.text+0x361): undefined reference to `arcs::common_interface::RobotState::isWithinSafetyLimits()' /usr/bin/ld: example_state.cpp:(.text+0x40e): undefined reference to `arcs::common_interface::AuboApi::getRobotInterface(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' /usr/bin/ld: example_state.cpp:(.text+0x432): undefined reference to `arcs::common_interface::RobotInterface::getRobotState()' /usr/bin/ld: example_state.cpp:(.text+0x456): undefined reference to `arcs::common_interface::RobotState::getTcpPose()' /usr/bin/ld: example_state.cpp:(.text+0x558): undefined reference to `arcs::common_interface::AuboApi::getRobotInterface(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' /usr/bin/ld: example_state.cpp:(.text+0x57c): undefined reference to `arcs::common_interface::RobotInterface::getRobotState()' /usr/bin/ld: example_state.cpp:(.text+0x5a0): undefined reference to `arcs::common_interface::RobotState::getToolPose()' /usr/bin/ld: example_state.cpp:(.text+0x6a2): undefined reference to `arcs::common_interface::AuboApi::getRobotInterface(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' /usr/bin/ld: example_state.cpp:(.text+0x6c6): undefined reference to `arcs::common_interface::RobotInterface::getRobotState()' /usr/bin/ld: example_state.cpp:(.text+0x6ea): undefined reference to `arcs::common_interface::RobotState::getJointState()' /usr/bin/ld: example_state.cpp:(.text+0x7ec): undefined reference to `arcs::common_interface::AuboApi::getRobotInterface(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' /usr/bin/ld: example_state.cpp:(.text+0x810): undefined reference to `arcs::common_interface::RobotInterface::getRobotState()' /usr/bin/ld: example_state.cpp:(.text+0x834): undefined reference to `arcs::common_interface::RobotState::getJointServoMode()' /usr/bin/ld: example_state.cpp:(.text+0x936): undefined reference to `arcs::common_interface::AuboApi::getRobotInterface(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' /usr/bin/ld: example_state.cpp:(.text+0x95a): undefined reference to `arcs::common_interface::RobotInterface::getRobotState()' /usr/bin/ld: example_state.cpp:(.text+0x97e): undefined reference to `arcs::common_interface::RobotState::getJointPositions()' /usr/bin/ld: example_state.cpp:(.text+0xa80): undefined reference to `arcs::common_interface::AuboApi::getRobotInterface(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' /usr/bin/ld: example_state.cpp:(.text+0xaa4): undefined reference to `arcs::common_interface::RobotInterface::getRobotState()' /usr/bin/ld: example_state.cpp:(.text+0xac8): undefined reference to `arcs::common_interface::RobotState::getJointCurrents()' /usr/bin/ld: example_state.cpp:(.text+0xbca): undefined reference to `arcs::common_interface::AuboApi::getRobotInterface(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' /usr/bin/ld: example_state.cpp:(.text+0xbee): undefined reference to `arcs::common_interface::RobotInterface::getRobotState()' /usr/bin/ld: example_state.cpp:(.text+0xc12): undefined reference to `arcs::common_interface::RobotState::getJointVoltages()' /usr/bin/ld: example_state.cpp:(.text+0xd14): undefined reference to `arcs::common_interface::AuboApi::getRobotInterface(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' /usr/bin/ld: example_state.cpp:(.text+0xd38): undefined reference to `arcs::common_interface::RobotInterface::getRobotState()' /usr/bin/ld: example_state.cpp:(.text+0xd5c): undefined reference to `arcs::common_interface::RobotState::getJointTemperatures()' /usr/bin/ld: example_state.cpp:(.text+0xe5e): undefined reference to `arcs::common_interface::AuboApi::getRobotInterface(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' /usr/bin/ld: example_state.cpp:(.text+0xe82): undefined reference to `arcs::common_interface::RobotInterface::getRobotState()' /usr/bin/ld: example_state.cpp:(.text+0xea6): undefined reference to `arcs::common_interface::RobotState::getJointUniqueIds[abi:cxx11]()' /usr/bin/ld: example_state.cpp:(.text+0xfa8): undefined reference to `arcs::common_interface::AuboApi::getRobotInterface(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' /usr/bin/ld: example_state.cpp:(.text+0xfcc): undefined reference to `arcs::common_interface::RobotInterface::getRobotState()' /usr/bin/ld: example_state.cpp:(.text+0xff0): undefined reference to `arcs::common_interface::RobotState::getJointFirmwareVersions()' /usr/bin/ld: example_state.cpp:(.text+0x10f2): undefined reference to `arcs::common_interface::AuboApi::getRobotInterface(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' /usr/bin/ld: example_state.cpp:(.text+0x1116): undefined reference to `arcs::common_interface::RobotInterface::getRobotState()' /usr/bin/ld: example_state.cpp:(.text+0x113a): undefined reference to `arcs::common_interface::RobotState::getJointHardwareVersions()' /usr/bin/ld: example_state.cpp:(.text+0x123c): undefined reference to `arcs::common_interface::AuboApi::getRobotInterface(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' /usr/bin/ld: example_state.cpp:(.text+0x1260): undefined reference to `arcs::common_interface::RobotInterface::getRobotState()' /usr/bin/ld: example_state.cpp:(.text+0x1284): undefined reference to `arcs::common_interface::RobotState::getMasterBoardUniqueId[abi:cxx11]()' /usr/bin/ld: example_state.cpp:(.text+0x1332): undefined reference to `arcs::common_interface::AuboApi::getRobotInterface(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' /usr/bin/ld: example_state.cpp:(.text+0x1356): undefined reference to `arcs::common_interface::RobotInterface::getRobotState()' /usr/bin/ld: example_state.cpp:(.text+0x136d): undefined reference to `arcs::common_interface::RobotState::getMasterBoardFirmwareVersion()' /usr/bin/ld: example_state.cpp:(.text+0x13f7): undefined reference to `arcs::common_interface::AuboApi::getRobotInterface(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' /usr/bin/ld: example_state.cpp:(.text+0x141b): undefined reference to `arcs::common_interface::RobotInterface::getRobotState()' /usr/bin/ld: example_state.cpp:(.text+0x1432): undefined reference to `arcs::common_interface::RobotState::getMasterBoardHardwareVersion()' /usr/bin/ld: example_state.cpp:(.text+0x14cb): undefined reference to `arcs::common_interface::AuboApi::getRobotInterface(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' /usr/bin/ld: example_state.cpp:(.text+0x14ef): undefined reference to `arcs::common_interface::RobotInterface::getRobotState()' /usr/bin/ld: example_state.cpp:(.text+0x1513): undefined reference to `arcs::common_interface::RobotState::getSlaveBoardUniqueId[abi:cxx11]()' /usr/bin/ld: example_state.cpp:(.text+0x15c1): undefined reference to `arcs::common_interface::AuboApi::getRobotInterface(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' /usr/bin/ld: example_state.cpp:(.text+0x15e5): undefined reference to `arcs::common_interface::RobotInterface::getRobotState()' /usr/bin/ld: example_state.cpp:(.text+0x15fc): undefined reference to `arcs::common_interface::RobotState::getSlaveBoardFirmwareVersion()' /usr/bin/ld: example_state.cpp:(.text+0x1686): undefined reference to `arcs::common_interface::AuboApi::getRobotInterface(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' /usr/bin/ld: example_state.cpp:(.text+0x16aa): undefined reference to `arcs::common_interface::RobotInterface::getRobotState()' /usr/bin/ld: example_state.cpp:(.text+0x16c1): undefined reference to `arcs::common_interface::RobotState::getSlaveBoardHardwareVersion()' /usr/bin/ld: example_state.cpp:(.text+0x175a): undefined reference to `arcs::common_interface::AuboApi::getRobotInterface(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' /usr/bin/ld: example_state.cpp:(.text+0x177e): undefined reference to `arcs::common_interface::RobotInterface::getRobotState()' /usr/bin/ld: example_state.cpp:(.text+0x179f): undefined reference to `arcs::common_interface::RobotState::getToolUniqueId[abi:cxx11]()' /usr/bin/ld: example_state.cpp:(.text+0x1847): undefined reference to `arcs::common_interface::AuboApi::getRobotInterface(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' /usr/bin/ld: example_state.cpp:(.text+0x186b): undefined reference to `arcs::common_interface::RobotInterface::getRobotState()' /usr/bin/ld: example_state.cpp:(.text+0x1882): undefined reference to `arcs::common_interface::RobotState::getToolFirmwareVersion()' /usr/bin/ld: example_state.cpp:(.text+0x190c): undefined reference to `arcs::common_interface::AuboApi::getRobotInterface(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' /usr/bin/ld: example_state.cpp:(.text+0x1930): undefined reference to `arcs::common_interface::RobotInterface::getRobotState()' /usr/bin/ld: example_state.cpp:(.text+0x1947): undefined reference to `arcs::common_interface::RobotState::getToolHardwareVersion()' /usr/bin/ld: example_state.cpp:(.text+0x19dd): undefined reference to `arcs::common_interface::AuboApi::getRobotInterface(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' /usr/bin/ld: example_state.cpp:(.text+0x1a01): undefined reference to `arcs::common_interface::RobotInterface::getRobotState()' /usr/bin/ld: example_state.cpp:(.text+0x1a22): undefined reference to `arcs::common_interface::RobotState::getPedestalUniqueId[abi:cxx11]()' /usr/bin/ld: example_state.cpp:(.text+0x1ac4): undefined reference to `arcs::common_interface::AuboApi::getRobotInterface(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' /usr/bin/ld: example_state.cpp:(.text+0x1ae8): undefined reference to `arcs::common_interface::RobotInterface::getRobotState()' /usr/bin/ld: example_state.cpp:(.text+0x1aff): undefined reference to `arcs::common_interface::RobotState::getPedestalFirmwareVersion()' /usr/bin/ld: example_state.cpp:(.text+0x1b89): undefined reference to `arcs::common_interface::AuboApi::getRobotInterface(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' /usr/bin/ld: example_state.cpp:(.text+0x1bad): undefined reference to `arcs::common_interface::RobotInterface::getRobotState()' /usr/bin/ld: example_state.cpp:(.text+0x1bc4): undefined reference to `arcs::common_interface::RobotState::getPedestalHardwareVersion()' /usr/bin/ld: example_state.cpp:(.text+0x1c5d): undefined reference to `arcs::common_interface::AuboApi::getRobotInterface(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' /usr/bin/ld: example_state.cpp:(.text+0x1c81): undefined reference to `arcs::common_interface::RobotInterface::getRobotState()' /usr/bin/ld: example_state.cpp:(.text+0x1ca5): undefined reference to `arcs::common_interface::RobotState::getJointTargetPositions()' /usr/bin/ld: example_state.cpp:(.text+0x1d98): undefined reference to `arcs::common_interface::AuboApi::getRobotInterface(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' /usr/bin/ld: example_state.cpp:(.text+0x1dbc): undefined reference to `arcs::common_interface::RobotInterface::getRobotState()' /usr/bin/ld: example_state.cpp:(.text+0x1dd3): undefined reference to `arcs::common_interface::RobotState::getControlBoxTemperature()' /usr/bin/ld: example_state.cpp:(.text+0x1e67): undefined reference to `arcs::common_interface::AuboApi::getRobotInterface(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' /usr/bin/ld: example_state.cpp:(.text+0x1e8b): undefined reference to `arcs::common_interface::RobotInterface::getRobotState()' /usr/bin/ld: example_state.cpp:(.text+0x1ea2): undefined reference to `arcs::common_interface::RobotState::getMainVoltage()' /usr/bin/ld: example_state.cpp:(.text+0x1f36): undefined reference to `arcs::common_interface::AuboApi::getRobotInterface(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' /usr/bin/ld: example_state.cpp:(.text+0x1f5a): undefined reference to `arcs::common_interface::RobotInterface::getRobotState()' /usr/bin/ld: example_state.cpp:(.text+0x1f71): undefined reference to `arcs::common_interface::RobotState::getMainCurrent()' /usr/bin/ld: example_state.cpp:(.text+0x2005): undefined reference to `arcs::common_interface::AuboApi::getRobotInterface(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' /usr/bin/ld: example_state.cpp:(.text+0x2029): undefined reference to `arcs::common_interface::RobotInterface::getRobotState()' /usr/bin/ld: example_state.cpp:(.text+0x2040): undefined reference to `arcs::common_interface::RobotState::getRobotVoltage()' /usr/bin/ld: example_state.cpp:(.text+0x20d4): undefined reference to `arcs::common_interface::AuboApi::getRobotInterface(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' /usr/bin/ld: example_state.cpp:(.text+0x20f8): undefined reference to `arcs::common_interface::RobotInterface::getRobotState()' /usr/bin/ld: example_state.cpp:(.text+0x210f): undefined reference to `arcs::common_interface::RobotState::getRobotCurrent()' /usr/bin/ld: CMakeFiles/example_state.dir/src/example_state.cpp.o: in function `main': example_state.cpp:(.text+0x2e96): undefined reference to `arcs::aubo_sdk::RpcClient::setRequestTimeout(int)' /usr/bin/ld: example_state.cpp:(.text+0x2edc): undefined reference to `arcs::aubo_sdk::RpcClient::connect(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)' /usr/bin/ld: example_state.cpp:(.text+0x2f62): undefined reference to `arcs::aubo_sdk::RpcClient::login(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' /usr/bin/ld: example_state.cpp:(.text+0x2fd4): undefined reference to `arcs::aubo_sdk::RpcClient::logout()' /usr/bin/ld: example_state.cpp:(.text+0x2fe8): undefined reference to `arcs::aubo_sdk::RpcClient::disconnect()' /usr/bin/ld: CMakeFiles/example_state.dir/src/example_state.cpp.o: in function `void __gnu_cxx::new_allocator<arcs::aubo_sdk::RpcClient>::construct<arcs::aubo_sdk::RpcClient>(arcs::aubo_sdk::RpcClient*)': example_state.cpp:(.text._ZN9__gnu_cxx13new_allocatorIN4arcs8aubo_sdk9RpcClientEE9constructIS3_JEEEvPT_DpOT0_[_ZN9__gnu_cxx13new_allocatorIN4arcs8aubo_sdk9RpcClientEE9constructIS3_JEEEvPT_DpOT0_]+0x36): undefined reference to `arcs::aubo_sdk::RpcClient::RpcClient(int)' collect2: error: ld returned 1 exit status make[2]: *** [ssp_gripper/CMakeFiles/example_state.dir/build.make:84:/home/robot-nanjing/mytest/gripper_ws/devel/lib/ssp_gripper/example_state] 错误 1 make[1]: *** [CMakeFiles/Makefile2:925:ssp_gripper/CMakeFiles/example_state.dir/all] 错误 2 make[1]: *** 正在等待未完成的任务.... [ 90%] Generating Python msg __init__.py for ssp_gripper [ 90%] Built target ssp_gripper_generate_messages_cpp [ 90%] Built target ssp_gripper_generate_messages_py [ 90%] Built target ssp_gripper_generate_messages_eus make: *** [Makefile:141:all] 错误 2 Invoking "make -j16 -l16" failed robot-nanjing@robotnanjing-QiTianM430-N000:~/mytest/gripper_ws$
最新发布
09-09
<think> 我们注意到在构建example_state目标时出现了大量的未定义引用错误,这些错误指向arcs::aubo_sdk命名空间中的函数。这表明链接器未能找到aubo_sdk库中的符号。根据之前的CMakeLists内容,我们已经通过find_package(aubo_sdk REQUIRED)来查找aubo_sdk,但在链接example_state时,我们只链接了aubo_sdk::aubo_sdk(使用target_link_libraries(example_state aubo_sdk::aubo_sdk))。然而,错误信息表明链接器没有找到这些符号,可能是以下原因之一: 1. aubo_sdk库没有正确导入,或者库路径没有被正确设置。 2. 在链接时,aubo_sdk库没有被正确链接到目标。 在提供的CMakeLists中,我们为example_state设置了链接: ```cmake target_link_libraries(example_state ${catkin_LIBRARIES} aubo_sdk::aubo_sdk ) ``` 但是,根据错误信息,似乎链接器没有找到aubo_sdk库中的符号。我们需要检查: a) find_package(aubo_sdk)是否成功,是否设置了aubo_sdk_LIBRARIES或类似变量。 b) aubo_sdk是否提供了导入目标(例如aubo_sdk::aubo_sdk),并且这个目标是否包含了所有必要的链接信息。 在CMakeLists中,我们是这样查找aubo_sdk的: ```cmake find_package(aubo_sdk REQUIRED PATHS /home/robot-nanjing/aubo_sdk-0.26.0-rc.1-Linux_x86_64+ce93216/lib/cmake/aubo_sdk NO_DEFAULT_PATH ) ``` 如果aubo_sdk的CMake配置文件正确,那么应该会定义一个目标(比如aubo_sdk::aubo_sdk)。但是,从错误来看,这个目标可能没有正确设置,或者库文件路径没有被正确包含。 另外,在CMakeLists中,我们还尝试为example_state设置RPATH: ```cmake set_target_properties(example_state PROPERTIES BUILD_RPATH "/home/robot-nanjing/aubo_sdk-0.26.0-rc.1-Linux_x86_64+ce93216/lib" INSTALL_RPATH "/home/robot-nanjing/aubo_sdk-0.26.0-rc.1-Linux_x86_64+ce93216/lib" ) ``` 这可能是为了避免运行时找不到库,但这里的问题是链接时找不到符号,所以问题出在链接阶段。 ### 解决方案 1. **确保find_package成功**:在CMakeLists中,可以在find_package之后打印相关信息,例如: ```cmake if(aubo_sdk_FOUND) message(STATUS "aubo_sdk found: ${aubo_sdk_DIR}") message(STATUS "aubo_sdk libraries: ${aubo_sdk_LIBRARIES}") else() message(FATAL_ERROR "aubo_sdk not found") endif() ``` 2. **检查aubo_sdk提供的目标**:如果aubo_sdk使用现代CMake方式提供了目标,那么我们应该使用这个目标进行链接。如果它没有提供目标,而是提供了变量(如aubo_sdk_LIBRARIES和aubo_sdk_INCLUDE_DIRS),那么我们需要手动将这些链接到目标。 3. **修改链接指令**:如果aubo_sdk没有提供目标,我们需要使用变量来链接。例如,将: ```cmake target_link_libraries(example_state aubo_sdk::aubo_sdk) ``` 改为: ```cmake target_link_libraries(example_state ${aubo_sdk_LIBRARIES}) ``` 4. **添加包含目录**:确保example_state包含了aubo_sdk的头文件目录。在CMakeLists中,我们已经为ssp_gripper添加了包含目录,但是example_state可能没有包含aubo_sdk的头文件。我们可以添加: ```cmake target_include_directories(example_state SYSTEM PUBLIC ${aubo_sdk_INCLUDE_DIRS} ) ``` 5. **检查库文件是否存在**:确保在指定的路径下(/home/robot-nanjing/aubo_sdk-0.26.0-rc.1-Linux_x86_64+ce93216/lib)存在libaubo_sdk.so(或类似)的库文件。 ### 修改后的CMakeLists片段 在example_state的配置部分,我们可以这样修改: ```cmake # 在find_package(aubo_sdk)之后,假设它设置了aubo_sdk_LIBRARIES和aubo_sdk_INCLUDE_DIRS # 如果aubo_sdk提供了目标,我们使用目标;否则使用变量 # 这里我们假设它提供了目标,但链接失败,所以尝试使用变量(如果目标不可用) # 首先,检查是否定义了aubo_sdk_LIBRARIES if(TARGET aubo_sdk::aubo_sdk) message(STATUS "Using aubo_sdk target: aubo_sdk::aubo_sdk") set(AUBO_SDK_LIB aubo_sdk::aubo_sdk) elseif(aubo_sdk_LIBRARIES) message(STATUS "Using aubo_sdk libraries: ${aubo_sdk_LIBRARIES}") set(AUBO_SDK_LIB ${aubo_sdk_LIBRARIES}) # 同时添加包含目录 include_directories(${aubo_sdk_INCLUDE_DIRS}) else() message(FATAL_ERROR "aubo_sdk not found or no libraries set") endif() # 然后,在创建example_state目标后: add_executable(example_state src/example_state.cpp ) # 添加包含目录 target_include_directories(example_state SYSTEM PUBLIC ${aubo_sdk_INCLUDE_DIRS} ) target_link_libraries(example_state ${catkin_LIBRARIES} ${AUBO_SDK_LIB} ) # 设置RPATH(如果之前有设置,保留) set_target_properties(example_state PROPERTIES BUILD_RPATH "/home/robot-nanjing/aubo_sdk-0.26.0-rc.1-Linux_x86_64+ce93216/lib" INSTALL_RPATH "/home/robot-nanjing/aubo_sdk-0.26.0-rc.1-Linux_x86_64+ce93216/lib" ) ``` ### 注意 - 如果aubo_sdk的CMake配置没有正确设置,可能需要手动指定库文件路径和库名。例如: ```cmake target_link_libraries(example_state ${catkin_LIBRARIES} /home/robot-nanjing/aubo_sdk-0.26.0-rc.1-Linux_x86_64+ce93216/lib/libaubo_sdk.so ) ``` - 确保库文件的确存在,并且与编译环境兼容(例如,是64位,且编译器版本匹配)。 ### 其他可能的问题 - **编译器标准**:在CMakeLists中,我们设置了C++14标准。确保aubo_sdk库也是用相同或兼容的标准编译的。 - **符号可见性**:如果aubo_sdk库在编译时没有将符号导出(例如,没有使用-fvisibility=default),可能会导致链接器找不到符号。但通常库的提供者会处理这个问题。 通过上述修改,应该能解决链接错误。如果问题仍然存在,需要进一步检查aubo_sdk的安装和CMake配置文件。 </think> ### 编译错误分析与解决方案 根据您的编译日志,主要错误集中在`example_state.cpp`文件的链接阶段,出现大量"undefined reference"错误。这表明链接器无法找到`aubo_sdk`库中的符号实现。以下是具体分析和解决方案: #### 错误原因分析 1. **符号未链接**:所有未定义引用均来自`arcs::common_interface::AuboApi`命名空间,表明`aubo_sdk`库未正确链接到可执行文件 2. **目标链接缺失**:在`target_link_libraries`中未正确声明`aubo_sdk`的链接目标 ``` target_link_libraries(example_state ${catkin_LIBRARIES} aubo_sdk::aubo_sdk # 这里使用的是目标名称而非实际库 ) ``` ### 修复步骤(修改CMakeLists.txt) ```cmake # 在find_package(aubo_sdk)后添加库链接目标 if(aubo_sdk_FOUND) # 确保使用实际的库变量而非目标名称 target_link_libraries(example_state ${catkin_LIBRARIES} ${aubo_sdk_LIBRARIES} # 使用实际库变量 ) # 添加头文件包含路径 target_include_directories(example_state SYSTEM PUBLIC ${aubo_sdk_INCLUDE_DIRS} ) endif() # 修改RPATH设置(确保运行时加载) set_target_properties(example_state PROPERTIES BUILD_RPATH "${aubo_sdk_LIBRARY_DIRS}" # 使用库路径变量 INSTALL_RPATH "${aubo_sdk_LIBRARY_DIRS}" ) ``` #### 关键修改说明 1. **使用${aubo_sdk_LIBRARIES}替代目标名称**: - 原始代码使用`aubo_sdk::aubo_sdk`是CMake目标名,实际应使用`${aubo_sdk_LIBRARIES}`变量 2. **显式添加头文件路径**: ```cmake target_include_directories(example_state PUBLIC ${aubo_sdk_INCLUDE_DIRS} ) ``` 3. **动态库路径修正**: - 使用`${aubo_sdk_LIBRARY_DIRS}`替代硬编码路径,确保跨环境兼容性 #### 验证方法 1. 在`find_package`后添加调试信息: ```cmake message(STATUS "aubo_sdk libraries: ${aubo_sdk_LIBRARIES}") message(STATUS "aubo_sdk include dirs: ${aubo_sdk_INCLUDE_DIRS}") ``` 2. 编译后检查链接命令: ```bash make VERBOSE=1 | grep example_state # 应出现 -laubo_sdk 或类似链接指令 ``` ### 预防措施 1. **库文件存在性检查**: ```cmake if(NOT EXISTS "${aubo_sdk_LIBRARIES}") message(FATAL_ERROR "aubo_sdk library not found at ${aubo_sdk_LIBRARIES}") endif() ``` 2. **符号导出验证**(可选): ```bash nm -D ${aubo_sdk_LIBRARIES} | grep getRobotState # 应输出相关函数符号 ``` ### 补充建议 如果仍遇到问题,尝试在`package.xml`中添加显式依赖: ```xml <depend>aubo_sdk</depend> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值