سؤال

أنا أحاول الحصول على PhysX يعمل باستخدام أوبونتو.

أولا أنا تحميل SDK من هنا:


بعد ذلك قمت باستخراج الملفات و تثبيت كل حزمة مع:

dpkg -i filename.deb

هذا يعطيني الملفات التالية الموجودة في /usr/lib/PhysX/v2.8.1:

  • libNxCharacter.لذلك
  • libNxCooking.لذلك
  • libPhysXCore.لذلك
  • libNxCharacter.لذلك.1
  • libNxCooking.لذلك.1
  • libPhysXCore.لذلك.1

المقبل, أنا خلقت روابط رمزية إلى /usr/lib:

sudo ln -s /usr/lib/PhysX/v2.8.1/libNxCharacter.so.1 /usr/lib/libNxCharacter.so.1
sudo ln -s /usr/lib/PhysX/v2.8.1/libNxCooking.so.1 /usr/lib/libNxCooking.so.1
sudo ln -s /usr/lib/PhysX/v2.8.1/libPhysXCore.so.1 /usr/lib/libPhysXCore.so.1

الآن باستخدام الكسوف ، يجب تحديد المكتبات التالية (-l):

  • libNxCharacter.لذلك.1
  • libNxCooking.لذلك.1
  • libPhysXCore.لذلك.1

التالية مسارات البحث فقط في حالة (-L):

  • /usr/lib/PhysX/v2.8.1
  • /usr/lib

كما جيرالد Kaszuba اقترح أضفت التالية تشمل مسارات (-I):

  • /usr/lib/PhysX/v2.8.1
  • /usr/lib

ثم حاولت ترجمة التعليمات البرمجية التالية:

#include "NxPhysics.h"

NxPhysicsSDK* gPhysicsSDK = NULL;
NxScene* gScene = NULL;
NxVec3 gDefaultGravity(0,-9.8,0);

void InitNx()
{
    gPhysicsSDK = NxCreatePhysicsSDK(NX_PHYSICS_SDK_VERSION);

    if (!gPhysicsSDK)
    {
        std::cout<<"Error"<<std::endl;
        return;
    }

    NxSceneDesc sceneDesc;
    sceneDesc.gravity = gDefaultGravity;
    gScene = gPhysicsSDK->createScene(sceneDesc);
}

int main(int arc, char** argv)
{
    InitNx();

    return 0;
}

الخطأ الأول أحصل عليه هو:

NxPhysics.h:لا يوجد مثل هذا الملف أو الدليل

الذي يقول لي أن هذا المشروع هو من الواضح عدم ربط بشكل صحيح.يمكن لأحد أن يقول لي ما فعلته خطأ ، أو ماذا يجب أن أفعل لأحصل على مشروع تجميع?أنا باستخدام دول مجلس التعاون الخليجي C++ Compiler.شكرا مقدما!

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

المحلول

يبدو أنك تخلط بين ملفات الرأس وملفات المكتبة.NxPhysics.h هو ملف رأس التعليمات البرمجية المصدر.ملفات الرأس مطلوبة عند تجميع التعليمات البرمجية المصدر (وليس عند الارتباط).من المحتمل أن يكون موجودًا في مكان مثل /usr/include أو /usr/include/PhysX/v2.8.1 أو ما شابه.ابحث عن الموقع الحقيقي لهذا الملف وتأكد من استخدام الخيار -I لإخبار المترجم بمكانه، كما يقترح Gerald Kaszuba.

المكتبات مطلوبة عند ربط ملفات الكائنات المترجمة (وليس عند الترجمة).ستحتاج إلى التعامل مع هذا لاحقًا باستخدام الخيارين -L و -l.

ملحوظة:اعتمادًا على كيفية استدعاء gcc، يمكنك جعله يقوم بالتجميع ثم الارتباط باستدعاء واحد، ولكن خلف الكواليس لا يزال يقوم بخطوة الترجمة ثم خطوة الارتباط.


يحرر: تم إضافة شرح إضافي...

عند إنشاء ملف ثنائي باستخدام مترجم C/C++، يقرأ المترجم التعليمات البرمجية المصدر (ملفات .c أو .cpp).أثناء القراءة، توجد بشكل متكرر عبارات #include المستخدمة لقراءة ملفات ‎.h.توفر عبارات #include أسماء الملفات التي يجب تحميلها.يجب أن تكون هذه الملفات الدقيقة موجودة في مسار التضمين.في حالتك، يجب العثور على ملف بالاسم الدقيق "NxPhysics.h" في مكان ما في مسار التضمين.عادةً ما يكون /usr/include موجودًا في المسار افتراضيًا، وكذلك الدليل الحالي.إذا كانت الرؤوس في مكان آخر مثل دليل فرعي لـ /usr/include، فأنت بحاجة دائمًا إلى إخبار المترجم صراحةً بالمكان الذي يبحث فيه باستخدام مفاتيح سطر الأوامر -I (أو أحيانًا باستخدام متغيرات البيئة أو طرق تكوين النظام الأخرى).

يتضمن ملف الرأس ‎.h عادةً تعريفات بنية البيانات، وتعريفات الوظائف المضمنة، وإعلانات الوظائف والفئة، و#define وحدات الماكرو.عند الانتهاء من التحويل البرمجي، يتم إنشاء ملف كائن .o.لا يعرف المترجم شيئًا عن المكتبات .so أو .a ولا يمكنه استخدامها بأي شكل من الأشكال، بخلاف تضمين القليل من المعلومات المساعدة للرابط.لاحظ أن المترجم يقوم أيضًا بتضمين بعض معلومات "الرأس" في ملفات الكائنات.أضع "الرأس" بين علامتي اقتباس لأن المعلومات تتوافق تقريبًا تقريبًا مع ما قد يكون موجودًا أو لا يوجد في ملفات .h.ويتضمن تمثيلاً ثنائيًا لجميع الإعلانات المصدرة.لم يتم العثور على وحدات ماكرو هناك.أعتقد أنه تم حذف الوظائف المضمنة أيضًا (على الرغم من أنني قد أكون مخطئًا هناك).

بمجرد وجود جميع ملفات .o، فقد حان الوقت ليتولى برنامج آخر المهمة:الرابط.الرابط لا يعرف شيئًا عن ملفات التعليمات البرمجية المصدر أو ملفات الرأس .h.إنه يهتم فقط بالمكتبات الثنائية وملفات الكائنات.يمكنك منحها مجموعة من المكتبات وملفات الكائنات.في "رؤوسهم" يدرجون الأشياء (أنواع البيانات، والوظائف، وما إلى ذلك) التي يحددونها والأشياء التي يحتاجون إلى شخص آخر لتحديدها.يقوم الرابط بعد ذلك بمطابقة طلبات التعريفات من إحدى الوحدات النمطية مع التعريفات الفعلية للوحدات النمطية الأخرى.فهو يتحقق للتأكد من عدم وجود تعريفات متضاربة متعددة، وفي حالة إنشاء ملف قابل للتنفيذ، فإنه يتأكد من استيفاء جميع طلبات التعريفات.

هناك بعض التحذيرات الملحوظة للوصف أعلاه.أولاً، من الممكن الاتصال بـ gcc مرة واحدة وجعله يقوم بالتجميع والربط، على سبيل المثال.

gcc hello.c -o hello

سيقوم أولاً بتجميع hello.c إلى الذاكرة أو إلى ملف مؤقت، ثم سيتم ربطه بالمكتبات القياسية وكتابة ملف hello القابل للتنفيذ.على الرغم من أنها مكالمة واحدة فقط إلى gcc، إلا أنه لا يزال يتم تنفيذ كلا الخطوتين بالتسلسل، لتسهيل الأمر عليك.سأتخطى وصف بعض تفاصيل المكتبات الديناميكية في الوقت الحالي.

إذا كنت مبرمج Java، فقد تكون بعض ما سبق مربكًا بعض الشيء.أعتقد أن .net يعمل مثل Java، لذا يجب أن تنطبق المناقشة التالية على لغة C# ولغات .net الأخرى.Java هي لغة أبسط بكثير من الناحية النحوية من C وC++.فهو يفتقر إلى وحدات الماكرو ويفتقر إلى القوالب الحقيقية (الأدوية العامة هي شكل ضعيف جدًا من القوالب).ولهذا السبب، تتخطى Java الحاجة إلى ملفات تعريف (.h) منفصلة وملفات تعريف (.c).كما أنه قادر على تضمين كافة المعلومات ذات الصلة في ملف الكائن (.class لـ Java).وهذا يجعل من الممكن لكل من المترجم والرابط استخدام ملفات .class مباشرة.

نصائح أخرى

كانت المشكلة بالفعل مع مسارات التضمين الخاصة بي.هنا هو الأمر ذو الصلة:

g++ -I/usr/include/PhysX/v2.8.1/SDKs/PhysXLoader/include -I/usr/include -I/usr/include/PhysX/v2.8.1/LowLevel/API/include -I/usr/include/PhysX/v2.8.1/LowLevel/hlcommon/include -I/usr/include/PhysX/v2.8.1/SDKs/Foundation/include -I/usr/include/PhysX/v2.8.1/SDKs/Cooking/include -I/usr/include/PhysX/v2.8.1/SDKs/NxCharacter/include -I/usr/include/PhysX/v2.8.1/SDKs/Physics/include -O0 -g3 -DNX_DISABLE_FLUIDS -DLINUX -Wall -c -fmessage-length=0 -MMD -MP -MF"main.d" -MT"main.d" -o"main.o" "../main.cpp"

أيضًا، بالنسبة للرابط، كانت هناك حاجة إلى "PhysXLoader" فقط (مثل Windows).وهكذا، لدي:

g++  -o"PhysXSetupTest"  ./main.o   -lglut -lPhysXLoader

أثناء تثبيت حصلت الخطأ التالية *

dpkg: dependency problems prevent configuration of libphysx-dev-2.8.1:
 libphysx-dev-2.8.1 depends on libphysx-2.8.1 (= 2.8.1-4); however:
  Package libphysx-2.8.1 is not configured yet.
dpkg: error processing libphysx-dev-2.8.1 (--install):
 dependency problems - leaving unconfigured
Errors were encountered while processing:

* إذا قمت بإعادة تثبيت *libphysx-2.8.1_4_i386.ديب*

sudo dpkg -i libphysx-2.8.1_4_i386.deb 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top