Установка и связывание библиотек PhysX в Debian Linux
Вопрос
Я пытаюсь заставить 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