2

我对 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 内核。

4

5 回答 5

1

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

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

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

于 2009-05-17T07:10:00.607 回答
0

的正确声明main()

int main(int argc, char **argv)

编辑以更正此答案:

这是因为 .c 的 compile -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

于 2009-05-16T13:28:45.273 回答
0

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

于 2009-05-17T08:29:06.937 回答
0

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

于 2009-12-30T04:49:25.470 回答
0

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

pthread_join(connector, NULL);

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

于 2010-12-11T14:38:37.917 回答