【问题标题】:Compiling C++ using -pthreads for Openwrt Linux-Get segmentation fault使用 -pthreads 为 Openwrt Linux 编译 C++ - 获取分段错误
【发布时间】:2010-10-26 17:21:59
【问题描述】:

我对 C++ 编程非常陌生,我正在使用 pthreads。我正在为 OpenWRT 交叉编译我的代码,但由于某种原因,当我在我的板上运行程序时出现分段错误,但它在我的 PC 上运行良好。我怀疑错误发生在编译的链接阶段,因为我尝试了一个小的 C 程序并且效果很好。此外,如果我将文件名更改为 .cpp 并使用 g++ 编译它也可以。

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

void *run(void *dummyPtr) {
    printf("I am a thread...\n");
    return NULL;
}

int main(int argc, char **argv) {
    printf("Main start...\n");
    pthread_t connector;
    pthread_create(&connector, NULL, run, NULL);
    printf("Main end...\n");
    return 0;
}

eclipse 编译器的输出:

**** Build of configuration Release for project ThreadTest ****

make all 
Building file: ../src/ThreadTest.cpp
Invoking: GCC C++ Compiler
mipsel-linux-g++ -O3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/ThreadTest.d" -MT"src/ThreadTest.d" -o"src/ThreadTest.o" "../src/ThreadTest.cpp" -lpthread
mipsel-linux-g++: -lpthread: linker input file unused because linking not done
Finished building: ../src/ThreadTest.cpp

Building target: ThreadTest
Invoking: GCC C++ Linker
mipsel-linux-g++  -o"ThreadTest"  ./src/ThreadTest.o    -lpthread -static
Finished building target: ThreadTest

编辑:删除旧代码并放入一个新的更简单的示例。如果我将其编译为 C 程序,则此代码运行,但如果我将其编译为 C++ 程序,则不会运行。我正在板上运行 2.6.26.3 内核。

【问题讨论】:

  • 不确定这是否只是一个仓促的示例 pgm,但在注释掉相机内容后,它只是挂在我的系统上。添加一些 pthread_join() 语句后,它至少运行完成。我不知道这是否与您最初的问题有关,但您的主板上的 main() 可能在线程完成之前退出。
  • 代码在我运行 Ubuntu 的电脑上运行良好。但是当我为 Openwrt 编译它时,它似乎没有进入 main,因为我没有看到输出“Main start...”这个问题似乎与 C++ 编译器有关,因为如果我使用 C 编译器它就可以工作

标签: c++ linux embedded pthreads segmentation-fault


【解决方案1】:

这很可能是由于内存不足造成的。您应该尝试启用某种形式的页面文件并释放任何其他内存。

另外,为什么是-static?如果您使用动态-lpthread,链接共享库不是更可取吗?

另外,这可能是由于您的 C++ 库不匹配,请确保您的 uclibc++ 是正确的版本,如果您还没有安装 ldd,您可能还需要安装。取决于你的固件。

【讨论】:

  • 是的,为什么是-static??我删除了标志,一切正常。
【解决方案2】:

使用 -lpthread 对 pthread 进行简单链接是不够的。您需要 gcc -pthread(作为它自己的选项)或 gcc -D_REENTRANT -lpthread(定义一个名为 _REENTRANT 的符号)。我不知道这是否会影响任何事情。

【讨论】:

    【解决方案3】:

    我不知道您是否找到了答案,或者这是否是问题所在,但您显示的代码中存在竞争条件。 main 可能会返回,并且您的程序将尝试在“运行”线程完成运行之前退出。你永远不能假设它会以任何特定的顺序或任何特定的时间运行。您应该添加对 pthread_join(connector, NULL); 的调用在从 main 返回之前。

    【讨论】:

      【解决方案4】:

      在从 main 返回并退出程序之前,你应该做一个

      pthread_join(connector, NULL);
      

      避免在线程终止之前退出您的应用程序。

      【讨论】:

        【解决方案5】:

        main() 的正确声明是

        int main(int argc, char **argv)
        

        已编辑以更正此答案:

        这是因为您的 .c 的编译 -c 行包含 -lpthread: 未使用的链接器输入文件

        我找到了这个关于在 openwrt 上编译 c++ 程序的答案:

        http://manoftoday.wordpress.com/2007/10/11/writing-and-compiling-a-simple-program-for-openwrt/

        我认为您还想阅读这篇文章以使 gdb 正常工作:

        http://forum.openwrt.org/viewtopic.php?pid=29712

        【讨论】:

          猜你喜欢
          • 2018-07-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-17
          • 1970-01-01
          • 2018-11-02
          • 1970-01-01
          相关资源
          最近更新 更多