سؤال

باستخدام Visual Studio 10 C ++ ، لدي خطأ في الارتباط غريب. لسبب ما ، لن ترتبط الإشارات إلى كائن عالمي بهذا الكائن العالمي. إنه يخبرني أن الرمز غير محدد ولكن عندما يكون لدي ملف .COD ، يكون الرمز صحيحًا في اليوم.

الخطأ:

FTShell.lib(ftcommodule.obj) : error LNK2001: unresolved external symbol
  "class CFTModuleShellBase * _pFTModule" (?_pFTModule@@3PAVCFTModuleShellBase@@A) 

لكن ملف .COD لملف CPP الرئيسي يعرض كل من الإعلان وتخصيص الرمز العالمي:

PUBLIC  ?_pFTModule@@3PAVCFTModuleShellBase@@A      ; _pFTModule

_DATA   SEGMENT
?_pFTModule@@3PAVCFTModuleShellBase@@A DD FLAT:?_Module@@3VCFTComModule@@A ; _pFTModule
    ORG $+4

فلماذا لا تتطابق المكتبة الثابتة _pftmodule مع الرمز العالمي في ملف المصدر الخاص بي؟

تحرير: ركضت msbuild من سطر الأوامر:

Link:
C:\Program Files\Microsoft Visual Studio 10.0\VC\bin\link.exe
/ERRORREPORT:QUEUE.... "C:\(path)\FTTrace.res"
"C:\(path)\FTTrace.obj"

ولاحظت في النهاية هناك ملف واحد فقط. هناك اثنين من ملفات .cpp في المشروع. و MSBuild قام ببناء كلا الملف. فلماذا لم يمر كل الملف على الرابط. لا يعامل ملف .vcxproj ملفات .cpp بشكل مختلف. لماذا لا يتضمن MSBuild كلا الملفين على خطوة الارتباط؟

<ItemGroup>
  <ClCompile Include="FTTrace.cpp" />
  <ClCompile Include="TraceImpl.cpp" />
</ItemGroup>
هل كانت مفيدة؟

المحلول

الغريب أن الخطأ كان نتيجة تعيين خاصية Implib على قيمة سيئة. قالت ورقة العقار: <ImpLib>$(OneOfMyPathVars)\%(Filename).lib</Implib>. نظرًا لأن ٪ (اسم الملف) فارغًا خلال مرحلة الارتباط "C: foo.lib" ، لا يتم إنشاء أي مؤشرات. وهذا تسبب في العوامل الخارجية التي لم يتم حلها من الوظائف المعلنة في المشروع. ربما خطأ في الرابط لكنه كان مصابًا بالذات.

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