سؤال

ولقد حاول تبحث في مشاكل مماثلة، ولكن لم يكن من السهل العثور على واحد التي ساعدت مشكلتي.

ولقد خلق مشروع في C ++ وأعمل على UNIX لتجميع، وصلة، وتشغيله. مشكلتي محددة هي إشارة غير محددة لطريقة أعلن في ملف منفصل.

في لSharedCache.cpp ملف، لدي طريقة التالي:

int SharedCache::replaceLine(ullong address){
    int evictPID = -1;

    int cacheSet = calcCacheSet( address );
    //random uniformly-distributed value for cache line
    float numLines = static_cast<float>(CACHE_LINES_PER_SET);
    uint cacheLine = static_cast<uint>(uniformDistr( numLines ));

    if(cache[cacheSet][cacheLine] != NULL){
        evictPID = cache[cacheSet][cacheLine]->PID;
    }

    uint PID= calcPID(address);
    uint tag= calcTag(address);

    cache[cacheSet][cacheLine]->setLine(PID, tag); //mutex method

    return PID;
}

ووuint cacheLine = static_cast<uint>( uniformDistr( numLines )); خط يجعل استدعاء الدالة أريد استخدام من ملف آخر. الخطأ رابط هو إشارة غير محددة إلى هذا الأسلوب.

وuniformDistr (تعويم)؛ أعلن في distributions.h رأس والمعرفة في distributions.cpp. في خيارات مشروعي أنا وضعت رابط -distributions العلم وأنا أيضا جمعت distributions.cpp للتأكد من ملف distributions.o موجود لربط مع.

من هنا، وأنا لا أعرف إلى أين أذهب، لأن هذا لم يحل المشكلة.

هل كانت مفيدة؟

المحلول

وأنا لم تستخدم كي ديفيلوب، ومع ذلك، على الخط الأمر الذي من شأنه أن مجرد إضافة distributions.o كملف مساهمة في عملية الربط. لا حاجة للحصول على شرطات أو ترك إيقاف تمديد .O.

وبدلا من ذلك، يمكنك فقط إضافة distributions.cpp لمشروع كي ديفيلوب الخاصة بك؟ أن الطريقة التي ينبغي أن تحصل على تجميعها وربطها تلقائيا (وهذا هو كيف يعمل في أشياء مثل فيجوال ستوديو لالكسوف).

نصائح أخرى

وبدون معلومات أكثر دقة عن التي تم التذرع الأوامر مترجم / رابط ومخرجات الخطأ بالضبط، فمن الصعب تقديم إجابة جيدة.

ولكن، من وصفك ما فعلتم، يبدو أنك لا يمر distributions.o إلى رابط. وخلافا لغات أخرى حيث مترجم / رابط البحث عن الملفات الكائن لربط تلقائيا، linkers C ++ تتطلب مواصفات واضحة من الكائنات لربط معا.

واستخدامك ل-ldistributions هنا غير صحيح: يستخدم العلم -l لربط ثابت أو دينامية <ط> مكتبة (على التوالي اللا والملفات. لذا على لينكس)، في حين كنت ترغب في تحديد آخر <ط> ملف الكائن أن رابط ينبغي أن تنظر. تحديد -ldistributions يجعل رابط يبحثون عن distributions.a أو distributions.so في المواقع مكتبة القياسية.

والأساس، والاحتجاج رابط الخاص بك يبدو الآن شيء من هذا القبيل (وربما مع العديد من الأعلام والمكتبات):

gcc -o my_program SharedCache.o -ldistributions

لربط بشكل صحيح رمز التوزيع في، تحتاج لجعلها تبدو شيء من هذا القبيل (مرة أخرى، العديد من الأعلام والمكتبات ربما في عداد المفقودين بالمقارنة مع الشيء الحقيقي):

gcc -o my_program SharedCache.o distributions.o

وهذا يجب حل قضية المفقودين وحرف إنتاج ثنائي (أو على أقل تقدير خطأ مختلفة ؛-)) العمل. كيفية القيام بذلك في كي ديفيلوب ولكن أنا لا أعرف.

هل إضافة distributions.cpp إلى MAKEFILE لديك؟ كما أعتقد أن العلم رابط المطلوب هو -ldistributions.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top