سؤال

انا استخدم CreateProcess استدعاء cl لتجميع وربط برنامج C++ آخر (TestProg.cxx) إلى ملف DLL.أنا أستحضر cl.exe مع خيارات التجميع التالية:

خيارات التجميع:

/Od /nologo /Fo /RTC /w /Zc TestProg.cxx /DLL

الاتصال:

if ( CreateProcess(PATH_TO_EXE, COMPILATION_OPTIONS, NULL,NULL,
                   FALSE,0,NULL,NULL,&si,&pi) ) 
{
    //....
}

لو TestProg.exe يتضمن #include <iostream.h> لقد حصلت على خطأ التجميع التالي:

TestProg.cpp(1) : fatal error C1034: iostream.h: no include path set

دون أي #include الأمر، لقد حصلت على خطأ الربط التالي:

LINK : fatal error LNK1104: cannot open file 'LIBCMT.lib'

ما الخطأ الذي افعله؟

لقد بحثت عن الإجابة خلال آخر 6-7 ساعات على الويب، لكن لم أجدها.يعد استخدام Windows API أمرًا جديدًا بالنسبة لي.

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

المحلول

إذا نظرت إلى تعريف CreateProcess:

BOOL WINAPI CreateProcess(
  __in_opt     LPCTSTR lpApplicationName,
  __inout_opt  LPTSTR lpCommandLine,
  __in_opt     LPSECURITY_ATTRIBUTES lpProcessAttributes,
  __in_opt     LPSECURITY_ATTRIBUTES lpThreadAttributes,
  __in         BOOL bInheritHandles,
  __in         DWORD dwCreationFlags,
  __in_opt     LPVOID lpEnvironment,
  __in_opt     LPCTSTR lpCurrentDirectory,
  __in         LPSTARTUPINFO lpStartupInfo,
  __out        LPPROCESS_INFORMATION lpProcessInformation
);

أنت تقوم بتعيين المعلمة الاختيارية __in_opt LPVOID lpEnvironment, ل NULL.

ووفقا للتعريف المذكور:

مؤشر إلى كتلة البيئة للعملية الجديدة.إذا كانت هذه المعلمة فارغة، فإن العملية الجديدة تستخدم بيئة عملية الاستدعاء.

cl.exe يحصل على معلومات الموقع ومسارات البحث في المكتبة من متغيرات البيئة - ألقِ نظرة على setenv.bat في دليل VS.في هذه الحالة، لا يتم تشغيل عملية الاستدعاء أو العملية المستهدفة في بيئة يتم فيها تعيين هذه المتغيرات.

لديك خيار - يمكنك إنشاء متغيرات البيئة بنفسك وفقًا لـ MSDN:

تتكون كتلة البيئة من كتلة من إنهاء فريدة من السلاسل المنهمة الفارغة.كل سلسلة على الشكل التالي:

name=value\0

نظرًا لأن العلامة المتساوية تستخدم كفاصل ، يجب عدم استخدامها باسم متغير البيئة.

أو يمكنك أن تطلب تشغيل برنامجك من موجه أدوات VS.التحقق الجيد من أن المشكلة في الواقع هي تشغيل البرنامج من هذه المطالبة، بدلاً من Visual Studio، لمعرفة ما إذا كان ذلك سيؤدي إلى حل المشكلة.

السبب عدم الاستخدام #include ينتج خطأ رابط بسبب عدم وجود تضمينات، cl.exe لن يبحث عنها - ثم يبحث عن مكتبة وقت تشغيل C/C++.

كملاحظة جانبية - أعتقد أن المعيار في C++ هو #include <iostream> أي بدون .h.

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