gpt4 book ai didi

linux - 在Debian Linux中安装和链接PhysX库

转载 作者:太空狗 更新时间:2023-10-29 12:22:18 26 4
gpt4 key购买 nike

我正在尝试使PhysX使用Ubuntu。

首先,我在这里下载了SDK:

  • http://developer.download.nvidia.com/PhysX/2.8.1/PhysX_2.8.1_SDK_CoreLinux_deb.tar.gz


  • 接下来,我提取文件并使用以下命令安装每个软件包:
    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的符号链接(symbolic link):
    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/lib/PhysX/v2.8.1
  • /usr/lib

  • 另外,正如Gerald 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: No such file or directory



    这告诉我该项目显然未正确链接。谁能告诉我我做错了什么,或者我需要做些什么才能使我的项目编译?我正在使用GCC C++编译器。提前致谢!

    最佳答案

    您似乎将头文件与库文件混淆了。 NxPhysics.h是源代 jetty 文件。编译源代码时(而不是链接时)需要头文件。它可能位于/usr/include或/usr/include/PhysX/v2.8.1等位置。如Gerald Kaszuba所建议的那样,找到该文件的真实位置,并确保使用-I选项告诉编译器它的位置。

    链接编译的目标文件时(而不是编译时)需要这些库。您稍后需要使用-L和-l选项来处理。

    注意:根据调用gcc的方式,您可以先进行gcc编译,然后通过单个调用进行链接,但是在后台,它仍然执行编译步骤,然后执行链接步骤。

    编辑:添加了额外的说明...

    使用C/C++编译器构建二进制文件时,编译器将读取源代码(.c或.cpp文件)。读取它时,经常有#include语句用于读取.h文件。 #include语句提供必须加载的文件的名称。这些确切的文件必须存在于包含路径中。在您的情况下,必须在包含路径中的某个位置找到一个确切名称为“NxPhysics.h”的文件。通常,默认情况下/usr/include位于路径中,当前目录也位于路径中。如果 header 在其他位置(例如/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)文件的需要。它还能够将所有相关信息嵌入到目标文件(Java为.class)中。这样一来,编译器和链接器都可以直接使用.class文件。

    关于linux - 在Debian Linux中安装和链接PhysX库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/415279/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com