문제

나는 Ubuntu를 사용하여 Physx를 작동 시키려고 노력하고 있습니다.

먼저 여기에서 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/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 : 그러한 파일이나 디렉토리가 없습니다

프로젝트가 분명히 제대로 연결되지 않았다는 것을 알려줍니다. 누구든지 내가 잘못한 일을 말해 줄 수 있습니까, 아니면 프로젝트를 컴파일하기 위해 무엇을 해야하는지 말해 줄 수 있습니까? GCC C ++ 컴파일러를 사용하고 있습니다. 미리 감사드립니다!

도움이 되었습니까?

해결책

헤더 파일을 라이브러리 파일과 혼동하는 것 같습니다. nxphysics.h는 소스 코드 헤더 파일입니다. 소스 코드를 컴파일 할 때 헤더 파일이 필요합니다 (링크 할 때는 아님). 아마도/usr/include 또는 /usr/include/v.v2.8.1과 같은 장소에있을 것입니다. 이 파일의 실제 위치를 찾아 -i 옵션을 사용하여 Gerald Kaszuba가 제안한 것처럼 컴파일러에 위치한 위치를 알려주십시오.

컴파일 된 객체 파일을 연결할 때 라이브러리가 필요합니다 (컴파일 시점이 아닌). 나중에 -L 옵션과 -L 옵션을 처리해야합니다.

참고 : GCC를 호출하는 방법에 따라 컴파일을 수행 한 다음 단일 호출과 연결할 수 있지만 장면 뒤에서 여전히 컴파일 단계를 수행 한 다음 링크 단계를 수행합니다.


편집하다: 추가 설명이 추가되었습니다 ...

C/C ++ 컴파일러를 사용하여 바이너리를 구축 할 때 컴파일러는 소스 코드 (.C 또는 .CPP 파일)를 읽습니다. 그것을 읽는 동안 .h 파일을 읽는 데 사용되는 #include 문이 자주 있습니다. #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 exepable을 작성합니다. GCC에 대한 한 번의 호출 일 뿐이지 만 두 단계는 여전히 당신에게 편의로 순차적으로 수행되고 있습니다. 지금은 동적 라이브러리의 세부 사항을 설명하면서 건너 뛸 것입니다.

Java 프로그래머라면 위의 일부는 약간 혼란 스러울 수 있습니다. .NET은 Java와 같이 작동한다고 생각하므로 다음 토론은 C# 및 다른 .NET 언어에 적용되어야합니다. Java는 C 및 C ++보다 훨씬 간단한 언어입니다. 매크로가 부족하고 실제 템플릿이 부족합니다 (제네릭은 매우 약한 형태의 템플릿). 이로 인해 Java는 별도의 선언 (.H) 및 정의 (.C) 파일의 필요성을 건너 뜁니다. 또한 모든 관련 정보를 객체 파일 (.class for 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