如何在 Nvidia PhysX 中编译独立片段?

How do you compile standalone snippets in Nvidia PhysX?

我开始通过在程序附带的基本 Hello World 片段上进行试验来测试 PhysX。

我的安装是在 Ubuntu 20.04.

据我了解

的源代码
/home/ubuntu1/PhysX/physx/bin/linux.clang/release/SnippetHelloWorld_64

位于

/home/ubuntu1/PhysX/physx/snippets/snippethelloworld

我尝试通过

编译它
clang++ -I/home/ubuntu1/PhysX/physx/install/linux/PhysX/include \
-I/home/ubuntu1/PhysX/physx/install/linux/PxShared/include \
SnippetHelloWorld.cpp

但是我得到一个错误

In file included from SnippetHelloWorld.cpp:39:
In file included from /home/ubuntu1/PhysX/physx/install/linux/PhysX/include/PxPhysicsAPI.h:45:
In file included from /home/ubuntu1/PhysX/physx/install/linux/PxShared/include/foundation/Px.h:37:
In file included from /home/ubuntu1/PhysX/physx/install/linux/PxShared/include/foundation/PxSimpleTypes.h:40:
/home/ubuntu1/PhysX/physx/install/linux/PxShared/include/foundation/PxPreprocessor.h:444:2: error: Exactly one of NDEBUG and _DEBUG needs to be defined!
#error Exactly one of NDEBUG and _DEBUG needs to be defined!
 ^
1 error generated.

显然,我应该在一个环境中编码。几乎所有的 PhysX 指令都是针对 Windows using Visual Studio IDE.

当我的目标只是复制 SnippetHelloWorld_64 时,我应该在哪里定义 NDEBUG_DEBUG

换句话说,我如何在 PhysX 中试验 HelloWorld(通过 Linux 命令行)?

这些是我在 Ubuntu 18.04 上构建 PhysX SDK 时使用的步骤:

  • 安装依赖项:sudo apt-get install clangsudo apt-get install cmakesudo apt-get install freeglut3-devsudo apt-get install libglew-devsudo apt-get install xtermsudo apt-get install nvidia-cg-toolkit

按照 README.md 和 运行 generate_projects.sh 中的说明并选择 linux 的选项,生成 cmake 设置。

进入 PhysX-4.1/physx/compiler/linux-debug 和 运行 make,这在我的笔记本电脑上花费了大约 10 分钟并编译了包含大量 .o.

最后 cd 进入 PhysX-4.1/physx/bin/linux.clang/debug 你应该可以 运行 ./SnippetHelloWorld_64 和其他演示:

编辑:

SnippetHelloWorld.cpp 依赖于一大堆其他文件,例如 SnippetHelloWorldRender.cpp、相机、碰撞检测代码以及来自 physx API 的任何其他文件 运行那个特定的例子都位于其他文件中。 make 系统自动将必要的依赖项校准为一个大命令,即。 g++ -I./include SnippetHelloWorld.cpp physx.o octree.a anotherdependency.x ... -o SnippetHelloWorld_64 等...为您节省您尝试做的事情,即手动解决所有依赖关系,除非您试图从整体中提取具有依赖关系的裸骨示例,否则我不推荐这样做 API 结构,在这种情况下,我仍然会使用手头的 make 系统并缓慢但肯定地删除 API 的部分,直到你有一个仍在构建的最小示例(在它沿途中断的任何时候反转) .无论如何,回到 make 系统。它不仅仅是一次构建一个库,它对于持续开发很有用,因为你可以第一次构建,需要很长时间,因为它构建了所有东西,但是如果你修改了一些文件并 运行 再次构建它只会重新编译您修改过的文件并重建最终的可执行文件,这对于 rapid 开发、试验和原型制作非常有用,同时具有结构良好的项目结构。编译器吐出这些错误的原因是因为这些定义基本上是编译器为配置 make 系统而自动生成的(grep 调试符号并看到它们在 makefile 中定义)。

简而言之,使用 make 系统,它有什么用。除非,你有一些与我在答案中假设的明显不同的原因,请具体说明,我会尽力帮忙,但 afaik make 系统是你的朋友,构建整个 api 一次会很慢,但会再做一次,它只会构建修改过的文件。