سؤال

أنا جديد جدًا في البرمجة بلغة 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. تحتاج -pthread دول مجلس التعاون الخليجي (كخيار الخاصة حقها) أو -lpthread -D_REENTRANT دول مجلس التعاون الخليجي (تحديد رمز اسمه _REENTRANT). أنا لا أعرف إذا كان هذا ضروريا يؤثر على أي شيء.

وأنا لا أعرف إذا وجدت جوابا بعد، أو إذا كان هذا هو المشكلة، ولكن هناك حالة تعارض في الرمز الذي أظهر. فمن الممكن أن أهم سيعود وسوف البرنامج يحاول الخروج قبل ان ينتهى بك "المدى" موضوع قيد التشغيل. أنت لا يمكن أبدا أن نفترض أنه سيتم تشغيل في أي ترتيب معين أو مع أي توقيت معين. يجب عليك إضافة استدعاء pthread_join (الموصل، 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