Компиляция C++ с использованием -pthreads для Openwrt Linux — ошибка сегментации Get
-
22-08-2019 - |
Вопрос
Я новичок в программировании на 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 работать: