鱼香ROS社区
    • 版块
    • 最新
    • 未解决
    • 已解决
    • 群组
    • 注册
    • 登录
    紧急通知:禁止一切关于政治&VPN翻墙等话题,发现相关帖子会立马删除封号
    提问前必看的发帖注意事项: 社区问答规则(小鱼个人)更新 | 高质量帖子发布指南

    在多线程学习这节内容colcon build出现了这些错误,请问是那里出现了问题,代码我也仔细检查了

    已定时 已固定 已锁定 已移动
    ROS 2相关问题
    colcon build thread
    2
    6
    286
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • H
      HarryHe
      最后由 编辑

      ubuntu20@ubuntu20:~/FishRos_Learn/chapter2/chapter2_ws$ colcon build
      Starting >>> demo_cpp_pkg
      --- stderr: demo_cpp_pkg
      CMake Error at CMakeLists.txt:49 (target_link_libraries):
      Cannot specify link libraries for target "learn_thread" which is not built
      by this project.

      make: *** [Makefile:530:cmake_check_build_system] 错误 1

      Failed <<< demo_cpp_pkg [0.56s, exited with code 2]

      Summary: 0 packages finished [0.82s]
      1 package failed: demo_cpp_pkg
      1 package had stderr output: demo_cpp_pkg

      1 条回复 最后回复 回复 引用 0
      • 小伊小
        机器人小伊
        最后由 编辑

        从错误信息来看,问题出现在 demo_cpp_pkg 包的构建过程中。错误提示为:

        CMake Error at CMakeLists.txt:49 (target_link_libraries):
        Cannot specify link libraries for target "learn_thread" which is not built by this project.
        

        这意味着在 CMakeLists.txt 文件的第49行,你试图为一个名为 learn_thread 的目标(target)指定链接库,但是这个目标并没有被定义在当前项目中。这里有几个可能的原因和解决方法:

        1. 目标名称错误:检查你的 CMakeLists.txt 文件中是否有定义名为 learn_thread 的可执行文件或库。可能的情况是,目标名称被错误地拼写或者根本就没有定义。

        2. 目标定义位置:确保 learn_thread 目标的定义在 target_link_libraries 调用之前。如果目标定义在后面,CMake 在处理到 target_link_libraries 时还不知道有 learn_thread 这个目标。

        3. 条件编译:如果 learn_thread 目标的定义在某些条件下被跳过(例如使用了 if() 语句),确保这些条件在当前构建环境中为真。

        4. 文件包含问题:如果 learn_thread 目标的定义在另一个 CMake 文件中,确保该文件被正确地包含(include() 或 add_subdirectory())进了主 CMakeLists.txt 文件。

        5. 清理和重新构建:有时候,旧的构建文件可能会导致问题。尝试清理你的构建环境(删除 build 和 install 目录,或者如果你使用的是 colcon,可以运行 colcon clean),然后重新运行 colcon build。

        解决步骤:

        • 打开 demo_cpp_pkg 包中的 CMakeLists.txt 文件。
        • 检查是否有定义 learn_thread 的 add_executable() 或 add_library() 调用。
        • 确保这个调用在 target_link_libraries(learn_thread ...) 之前。
        • 如果目标定义在条件语句中,检查条件是否应该为真。
        • 如果目标定义在其他文件中,确保这些文件被正确包含。

        如果上述步骤仍然无法解决问题,你可能需要仔细检查你的 CMake 配置或提供更多的代码上下文以便进一步分析。


        以上为生成回答,仅供参考~

        我是小伊,已接入ChatGpt,所有回复,仅供参考~

        H 1 条回复 最后回复 回复 引用 0
        • H
          HarryHe @小伊
          最后由 编辑

          @小伊 修改了以后出现了下面这个问题:
          Starting >>> demo_cpp_pkg
          --- stderr: demo_cpp_pkg
          /usr/bin/ld: CMakeFiles/learn_thread.dir/src/learn_thread.cpp.o: in function std::thread::thread<std::_Bind<void (Download::*(Download*, std::_Placeholder<1>, std::_Placeholder<2>, std::_Placeholder<3>))(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&, std::function<void (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&)> const&)>&, 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&, std::function<void (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&)> const&, void>(std::_Bind<void (Download::*(Download*, std::_Placeholder<1>, std::_Placeholder<2>, std::_Placeholder<3>))(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&, std::function<void (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&)> const&)>&, 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&, std::function<void (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&)> const&)': learn_thread.cpp:(.text._ZNSt6threadC2IRSt5_BindIFM8DownloadFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESA_RKSt8functionIFvSA_SA_EEEPS2_St12_PlaceholderILi1EESJ_ILi2EESJ_ILi3EEEEJSA_SA_SF_EvEEOT_DpOT0_[_ZNSt6threadC5IRSt5_BindIFM8DownloadFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESA_RKSt8functionIFvSA_SA_EEEPS2_St12_PlaceholderILi1EESJ_ILi2EESJ_ILi3EEEEJSA_SA_SF_EvEEOT_DpOT0_]+0x58): undefined reference to pthread_create'
          collect2: error: ld returned 1 exit status
          make[2]: *** [CMakeFiles/learn_thread.dir/build.make:84:learn_thread] 错误 1
          make[1]: *** [CMakeFiles/Makefile2:306:CMakeFiles/learn_thread.dir/all] 错误 2
          make: *** [Makefile:141:all] 错误 2

          Failed <<< demo_cpp_pkg [6.04s, exited with code 2]

          Summary: 0 packages finished [6.34s]
          1 package failed: demo_cpp_pkg
          1 package had stderr output: demo_cpp_pkg

          1 条回复 最后回复 回复 引用 0
          • 小伊小
            机器人小伊
            最后由 编辑

            这个错误信息显示链接器(ld)在尝试构建你的 C++ 项目时找不到 pthread_create 函数的定义。pthread_create 是 POSIX 线程库(pthread)中的一个函数,用于创建一个新线程。这个错误通常意味着你的项目没有正确地链接到 pthread 库。

            要解决这个问题,你需要确保在编译和链接你的项目时包含了 pthread 库。这通常可以通过在 CMakeLists.txt 文件中添加适当的链接指令来实现。以下是一些可能的解决方案:

            1. 修改 CMakeLists.txt

            在你的 CMakeLists.txt 文件中,确保为目标添加了 pthread 库的链接。你可以使用 target_link_libraries 命令来实现这一点。例如,如果你的目标名为 learn_thread,你可以这样修改:

            # 假设你已经有了类似这样的目标定义
            add_executable(learn_thread src/learn_thread.cpp)
            
            # 添加 pthread 库链接
            target_link_libraries(learn_thread pthread)
            

            2. 确保你的系统安装了 pthread 库

            大多数 Unix-like 系统(如 Linux 和 macOS)默认都安装了 pthread 库。但是,如果你在使用一个不常见的系统或者你的系统配置有所不同,可能需要确认 pthread 库是否可用。

            3. 使用正确的编译器和编译标志

            确保你使用的编译器支持 C++11 或更高版本(因为 std::thread 是 C++11 引入的),并且编译标志正确设置了对 C++11 或更高版本的支持。例如,如果你使用的是 g++,可以添加 -std=c++11 或更高版本(如 -std=c++14, -std=c++17 等)到你的编译标志中。在 CMake 中,你可以这样设置:

            set(CMAKE_CXX_STANDARD 11)
            set(CMAKE_CXX_STANDARD_REQUIRED True)
            

            4. 清理并重新构建项目

            在做了上述更改后,最好清理你的构建目录并重新构建项目,以确保所有的更改都被正确应用:

            # 清理构建目录(假设你在构建目录中)
            make clean
            
            # 或者删除整个构建目录然后重新创建
            rm -rf build
            mkdir build
            cd build
            
            # 重新运行 CMake 和 make
            cmake ..
            make
            

            应用这些更改后,你的项目应该能够正确地链接到 pthread 库,并且编译错误应该会消失。如果问题仍然存在,请检查你的 CMakeLists.txt 文件和编译命令是否有其他潜在的错误或不一致之处。


            以上为生成回答,仅供参考~

            我是小伊,已接入ChatGpt,所有回复,仅供参考~

            H 1 条回复 最后回复 回复 引用 0
            • H
              HarryHe @小伊
              最后由 编辑

              @小伊
              所提供的方式已解决问题

              1 条回复 最后回复 回复 引用 0
              • 小伊小
                机器人小伊
                最后由 编辑

                “所提供的方式已解决问题”这句话意味着采用某种特定的方法或途径已经成功地解决了某个问题。这里的“方式”可以指的是任何种类的解决方案、策略、方法或技术,而“问题”则是需要被解决或克服的难题或挑战。

                在实际应用中,这句话可能用于多种场合。例如,在项目管理中,如果团队采用了一种新的工作流程,并且这种流程有效地提高了项目效率,那么就可以说“所提供的新工作流程方式已解决问题”。又比如,在科学研究领域,如果研究人员发现了一种新的药物或治疗方法,并且这种方法能够成功治疗某种疾病,那么同样可以说“所提供的新药物/治疗方法方式已解决问题”。

                此外,这句话也强调了解决方案的有效性和实用性。它表明,所采用的方式不仅被证明是可行的,而且已经成功地解决了实际问题。这有助于增强人们对该方式的信心,并鼓励其他人也采用这种方式来解决类似的问题。

                总的来说,“所提供的方式已解决问题”是一句积极、肯定的话语,它表明某种方法或途径已经成功地解决了某个问题,为人们带来了实际的帮助和益处。


                以上为生成回答,仅供参考~

                我是小伊,已接入ChatGpt,所有回复,仅供参考~

                1 条回复 最后回复 回复 引用 0
                • 第一个帖子
                  最后一个帖子
                皖ICP备16016415号-7
                Powered by NodeBB | 鱼香ROS