Похоже, вы путаете заголовочные файлы с библиотечными файлами. 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.