2009-05-16 7 views
2

Я довольно новичок в программировании на C++ и использую pthreads. Я перекрестно компилирую свой код для OpenWRT, но по какой-то причине у меня возникает ошибка сегментации, когда я запускаю программу на своей плате, но она отлично работает на моем ПК. Я подозреваю, что ошибка возникает на этапе компоновки компиляции, потому что я пробовал небольшую программу на C и работал нормально. Также, если я изменю имя файла на .cpp и скомпилирую его с помощью g ++, он также работает.Компиляция C++ с использованием -pthreads для Openwrt Linux-Get segmentation fault

#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; 
} 

Выход из затмения компилятора:

**** 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 

Edit: Убрана старый код и поместить в новом простом примере. Этот код запускается, если я скомпилирую его как программу на C, но нет, если я скомпилирую его как программу на C++. Я запускаю ядро ​​2.6.26.3 на плате.

+0

Не уверен, что это был просто поспешный пример pgm, но после комментирования материала камеры он просто зависает в моей системе.После добавления некоторых операторов pthread_join() он, по крайней мере, завершил выполнение. Я понятия не имею, связано ли это с вашей исходной проблемой, но возможно, что на вашей плате main() выйдет до завершения потоков. – Duck

+0

Код работает нормально на моем компьютере под управлением Ubuntu. Но когда я компилирую его для Openwrt, он, похоже, не входит в основную, потому что я не вижу выход «Main start ...». Проблема, похоже, связана с компилятором C++, поскольку она работает, если я использую компилятор C – Stulli

ответ

1

Это легко может быть из-за нехватки памяти. Вы должны попытаться включить некоторую форму файла страницы и освободить любую другую память.

Кроме того, почему -статический? если вы используете динамический -lpthread, не будет ли связывать общую библиотеку предпочтительнее?

Кроме того, это может быть связано с неправильным совпадением вашего C++ lib, убедитесь, что ваша uclibc++ является правильной версией, вы также можете установить ldd, если вы еще этого не сделали. Зависит от вашей прошивки.

+0

Да, почему -статический? Я удалил флаг, и все работает нормально. – Stulli

+1

И большое спасибо всем за их время и силы – Stulli

0

Правильная декларация main() является

int main(int argc, char **argv) 

Edited исправить этот ответ:

Это потому, что при компиляции -с линии для .c включают -lpthread: линкер входной файл не используется

Я нашел этот ответ о компиляции C++-программ на openwrt:

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

Я думаю, вы также хотите, чтобы прочитать это, чтобы получить работу GDB:

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

+0

Я пробовал обе версии и не работал – Stulli

0

Недостаточно простой связи с pthread с помощью -lpthread. Вам нужен gcc -pthread (как вариант по своему усмотрению) или gcc -D_REENTRANT -lpthread (определите символ с именем _REENTRANT). Я не знаю, влияет ли это на что-либо.

0

Я не знаю, нашли ли вы ответ или если это была проблема, но в коде, который вы показали, есть состояние гонки. Возможно, что main вернется, и ваша программа попытается выйти до того, как поток «run» завершит работу. Вы никогда не можете предположить, что он будет работать в любом конкретном порядке или с определенным временем. Вы должны добавить вызов pthread_join (connector, NULL); перед возвращением из дома.

0

Перед возвращением из основных и, таким образом, выходя из программы, вы должны делать

pthread_join(connector, NULL); 

, который позволяет избежать выхода из приложения, прежде чем нить кончилась.