Domanda

Io abbastanza nuovo per la programmazione in C ++ e sto usando pthreads. Io attraversare compilare il mio codice per OpenWRT, ma per qualche ragione ho segmentation fault quando si esegue il programma sulla mia tavola, ma funziona benissimo sul mio PC. Ho il sospetto che l'errore si verifica nella fase di collegamento della compilazione perché ho provato un piccolo programma C e che ha funzionato bene. Anche se cambio il nome del file da cpp e compilarlo con g ++ funziona anche.

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

L'output del compilatore 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

Edit: Rimosso il vecchio codice e mettere in un nuovo esempio più semplice. Questo codice viene eseguito se compilo come un programma in C, ma non se compilo come un programma C ++. Io runnig il kernel 2.6.26.3 sulla scheda.

È stato utile?

Soluzione

Questo potrebbe facilmente essere dovuto a una condizione di memoria insufficiente. Si dovrebbe cercare di consentire una qualche forma di file di paging e liberare qualsiasi altra memoria.

Inoltre, perché -static? se si sta utilizzando un -lpthread dinamica, non avrebbe collegando la libreria condivisa preferibile?

Inoltre, potrebbe essere dovuto al C ++ lib dell'essere male assortita, assicurarsi che il uclibc++ è la versione corretta, si potrebbe anche voler installare LDD se non l'hai già. Dipende dal vostro firmware.

Altri suggerimenti

Non è sufficiente semplice link contro pthread con -lpthread. È necessario -pthread gcc (come opzione se stante) oppure gcc -lpthread -D_REENTRANT (definire un simbolo di nome _REENTRANT). Non so se questo necessario, influisce nulla.

Non so se hai trovato una risposta ancora o se questo era il problema, ma c'è una condizione di competizione nel codice che avete mostrato. E 'possibile che principale torneranno e il programma cercherà di uscire prima che il thread "run" ha finito di correre. Non si può mai supporre che verrà eseguito in un ordine particolare o con un particolare tempismo. Si dovrebbe aggiungere una chiamata a pthread_join (connettore, NULL); prima di tornare dalla principale.

Prima di tornare dalla principale e uscire dal programma in tal modo, si dovrebbe fare un

pthread_join(connector, NULL);

che evita uscendo dell'applicazione prima del thread è terminato.

Una corretta dichiarazione di main() è

int main(int argc, char **argv)

A cura di correggere questa risposta:

Questo è perché la vostra linea -c di compilazione per il vostro .c includono -lpthread: file di input del linker inutilizzato

Ho trovato questa risposta sulla compilazione C ++ programmi su OpenWRT:

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

Credo che si potrà anche leggere questo per ottenere lavoro gdb:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top