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 なのですか? dynamic を使用している場合-lpthread、共有ライブラリをリンクするのが望ましいではないでしょうか?

また、C++ ライブラリの不一致が原因であるuclibc++可能性もあります。正しいバージョンであることを確認してください。まだ ldd をインストールしていない場合は、インストールすることもできます。ファームウェアによって異なります。

于 2009-05-17T07:10:00.607 に答える
0

の正しい宣言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

于 2009-05-16T13:28:45.273 に答える
0

あなたがまだ答えを見つけたのか、それともこれが問題だったのかはわかりませんが、あなたが示したコードには競合状態があります。「実行」スレッドの実行が完了する前に、メインが戻り、プログラムが終了しようとする可能性があります。特定の順序または特定のタイミングで実行されるとは決して想定できません。pthread_join(connector, NULL); への呼び出しを追加する必要があります。メインから戻る前に。

于 2009-12-30T04:49:25.470 に答える
0

-lpthread を使用して pthread に対して単純にリンクするだけでは十分ではありません。gcc -pthread (独自のオプションとして) または gcc -D_REENTRANT -lpthread (_REENTRANT という名前のシンボルを定義) が必要です。この必要性が何かに​​影響するかどうかはわかりません。

于 2009-05-17T08:29:06.937 に答える
0

メインから戻ってプログラムを終了する前に、次のことを行う必要があります。

pthread_join(connector, NULL);

これにより、スレッドが終了する前にアプリケーションが終了することを回避できます。

于 2010-12-11T14:38:37.917 に答える