2009-02-01 4 views
0

라이브러리 (alibrary.lib)에 헤더 파일이 있습니다. 라이브러리는 정적 라이브러리 (.lib)이며 exe에 제대로 링크됩니다.C++ : 헤더 함수가 라이브러리에서 exe에 제대로 연결되지 않음

이제 Vector3d 클래스가 생겼습니다.

class Vector3d 
{ 
    void amethod() 
    { 
     blah 
    } 

}; 

Vector3d cross(const Vector3d &v0, const Vector3d &v1) 
{ 
     float x,y,z; 

     x = v0.y*v1.z-v0.z*v1.y; 
     y = v0.z*v1.x-v0.x*v1.z; 
     z = v0.x*v1.y-v0.y*v1.x; 

    return Vector3d(x,y,z); 

}

값 Vector3D 선언 및 헤더 파일 (.H 된 Vector3D)에 정의되어있다. 클래스 선언 다음에, 나는 십자가 함수입니다.

lib 디렉토리 컴파일 파일이지만,이 단위 테스트 EXE에 링크 할 때이 오류가 얻을 :

flywindow.obj :error LNK2005: "class Vector3d __cdecl cross(class Vector3d const &,class Vector3d const &)" ([email protected]@[email protected]@[email protected]@Z) already defined in fly.obj 

어떤 아이디어?

감사

답변

2

무료 (클래스의 구성원 아님) 함수를 정의하는 경우 별도로 컴파일 된 .cpp 파일에 정의하거나 헤더에 삽입하고 인라인으로 표시해야합니다. 따라서 귀하의 경우, 당신은이에 의해 컴파일하고 멀리 얻을 수 있습니다 :

inline Vector3d cross(const Vector3d &v0, const Vector3d &v1) { 
     float x,y,z; 

     x = v0.y*v1.z-v0.z*v1.y; 
     y = v0.z*v1.x-v0.x*v1.z; 
     z = v0.x*v1.y-v0.y*v1.x; 

    return Vector3d(x,y,z); 

} 

오류는 헤더에 함수의 정의를 가지고 있기 때문에 발생하지만 인라인을 표시하지 않았습니다. 이 헤더를 별도로 컴파일 된 두 개의 파일에 포함 시키면 링커는 컴파일 된 오브젝트 파일을 링크 할 때 두 번 정의되는 교차 함수를 보게되므로 오류가 발생합니다.

클래스 정의 내에서 정의 된 멤버 함수가 암시 적으로 인라인이기 때문에 클래스의 멤버 함수에 대해 명시 적으로 인라인하지 않고 작동합니다.

그러나 일반적으로 헤더에 함수 정의를 작성하는 것은 좋지 않습니다. 함수가 벡터 이외의 다른 유형에 의존하는 경우 (괜찮은 IMHO이지만, 물론 논란의 여지가있는 사람들이 있습니다.) 그런 다음 해당 유형의 헤더를 포함해야합니다. 그러면 헤더에 간접적으로 포함 된 코드가 불필요하게 늘어납니다.

Vector3d cross(const Vector3d &v0, const Vector3d &v1); 

을하지만 개별적으로 컴파일되어 .cpp 파일 내에서 정의 대신, 이러한 경우에 당신은 전적으로 헤더 안에 만 함수의 선언을 넣어 것입니다. 물론 인라인은 삭제해야합니다.


정의와 선언의 작은 목록을 추가하여 함수와 클래스에 대한 선언과 정의의 의미를 명확하게 설명합니다. 모든 정의는 선언이지만, 그 반대의 경우는 없습니다.

// class _declaration_ of boo 
class boo; 

// class _definition_ of foo. 
class foo { 
    // member function _declaration_ of bar 
    void bar(); 

    // member function _definition_ of baz 
    void baz() { } 
}; 

// function _definition_ of fuzz 
inline void fuzz() { } 

// function _declaration_ of fezz 
void fezz(); 
+0

인라인이 작동합니다. 감사 – cbrulak

1

가장 가능성있는 설명은 당신이 당신의 파일을 포함하고 파일이 두 개의 소스 파일, 따라서 이중 정의에 포함되는 포함에 (십자가의 구체적 정의) 코드를 가지고 있다는 점이다.

헤더 파일에는 정의가 아닌 선언이 있어야합니다. 선언 (뭔가 존재하는 것)은 typedef, 클래스 선언, 열거 형 등입니다.

정의 (존재하는 것들에 의미를 부여)는 함수, varialble 정의 등과 같은 것들입니다.

Vector3d cross(const Vector3d &v0, const Vector3d &v1); 

을하지만 별도의 소스 파일에 정의 :

당신의 간 기능

는 헤더 파일에 선언해야합니다.

관련 문제