Компиляция C ++ с использованием -pthreads для ошибки сегментации Openwrt Linux-Get - PullRequest
2 голосов
/ 16 мая 2009

Я довольно новичок в программировании на C ++ и использую pthreads. Я кросс-компилирую свой код для OpenWRT, но по какой-то причине я получаю ошибку сегментации, когда запускаю программу на своей плате, но она отлично работает на моем ПК. Я подозреваю, что ошибка возникает на этапе компоновки компиляции, потому что я пробовал небольшую программу на 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 на плате.

Ответы [ 5 ]

1 голос
/ 17 мая 2009

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

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

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

0 голосов
/ 11 декабря 2010

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

pthread_join(connector, NULL);

, который предотвращает выход из вашего приложения до завершения потока.

0 голосов
/ 30 декабря 2009

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

0 голосов
/ 17 мая 2009

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

0 голосов
/ 16 мая 2009

Правильное объявление main() равно

int main(int argc, char **argv)

Отредактировано, чтобы исправить этот ответ:

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

Я нашел ответ о компиляции программ на С ++ в 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

...