Установка и связывание библиотек PhysX в Debian Linux

StackOverflow https://stackoverflow.com/questions/415279

  •  03-07-2019
  •  | 
  •  

Вопрос

Я пытаюсь заставить PhysX работать, используя Ubuntu.

Во-первых, я скачал SDK здесь:


Затем я извлек файлы и установил каждый пакет с:

dpkg -i filename.deb

Это дает мне следующие файлы, расположенные в / usr / lib / PhysX /v2.8.1:

  • libNxCharacter.so
  • libNxCooking.so
  • libPhysXCore.so
  • libNxCharacter.so.1
  • libNxCooking.so.1
  • libPhysXCore.so.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

Теперь, используя Eclipse, я указал следующие библиотеки (-l):

  • libNxCharacter.so.1
  • libNxCooking.so.1
  • libPhysXCore.so.1

И следующие пути поиска на всякий случай (-L):

  • /usr/библиотека/PhysX/v2.8.1
  • /usr/библиотека

Кроме того, как предложил Джеральд Казуба, я добавил следующие включающие пути (-I):

  • /usr/библиотека/PhysX/v2.8.1
  • /usr/библиотека

Затем я попытался скомпилировать следующий код:

#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:Такого файла или каталога нет

Это говорит мне о том, что проект, очевидно, не связан должным образом.Кто-нибудь может сказать мне, что я сделал не так, или что еще мне нужно сделать, чтобы мой проект скомпилировался?Я использую компилятор GCC C ++.Заранее спасибо!

Это было полезно?

Решение

Похоже, вы путаете заголовочные файлы с библиотечными файлами.NxPhysics.h - это заголовочный файл исходного кода.Заголовочные файлы необходимы при компиляции исходного кода (не при компоновке).Вероятно, он расположен в таком месте, как /usr/include или /usr/include/PhysX /v2.8.1, или аналогичном.Найдите реальное местоположение этого файла и убедитесь, что вы используете опцию -I, чтобы сообщить компилятору, где он находится, как предлагает Джеральд Казуба.

Библиотеки необходимы при связывании скомпилированных объектных файлов (а не при компиляции).Вам нужно будет разобраться с этим позже с помощью опций -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.deb*

sudo dpkg -i libphysx-2.8.1_4_i386.deb 
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top