문제

나는 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 커널을 runnig합니다.

도움이 되었습니까?

해결책

이것은 메모리 조건이 낮기 때문일 수 있습니다. 어떤 형태의 페이지 파일을 활성화하고 다른 메모리를 확보해야합니다.

또한 왜 -스테이션? 동적을 사용하는 경우 -lpthread, 공유 라이브러리를 연결하는 것이 바람직하지 않습니까?

또한 C ++ lib가 잘못 일치했기 때문일 수 있습니다. uclibc++ 올바른 버전이므로 아직없는 경우 LDD를 설치할 수도 있습니다. 펌웨어에 따라 다릅니다.

다른 팁

-lpthread를 사용하여 pthread에 대해 간단한 링크로는 충분하지 않습니다. GCC -PTHREAD (자체 오른쪽 옵션) 또는 gcc -d_reentrant -lpthread (_reentrant라는 기호 정의)가 필요합니다. 이것이 필요한 것이 무엇이든 영향을 미치는지 모르겠습니다.

당신이 아직 답을 찾았는지 또는 이것이 문제인지는 모르겠지만, 당신이 보여준 코드에는 레이스 조건이 있습니다. "실행"스레드가 실행되기 전에 Main이 돌아오고 프로그램이 종료하려고 시도 할 수 있습니다. 특정 순서 또는 특정 타이밍으로 실행될 것이라고 생각할 수 없습니다. pthread_join (커넥터, null)에 호출을 추가해야합니다. 메인에서 돌아 오기 전에.

메인에서 돌아와서 프로그램을 종료하기 전에

pthread_join(connector, NULL);

스레드가 종료되기 전에 응용 프로그램을 종료하지 않습니다.

올바른 선언 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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top