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

StackOverflow https://stackoverflow.com/questions/872414

Вопрос

Я новичок в программировании на 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.

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

pthread_join(connector, NULL);

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

Правильное заявление о main() является

int main(int argc, char **argv)

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

Это связано с тем, что ваша строка компиляции -c для вашего .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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top