c++:헤더 기능되지 않을 제대로 연결되어 있는 라이브러리에서으로 exe

StackOverflow https://stackoverflow.com/questions/500182

  •  20-08-2019
  •  | 
  •  

문제

나는 헤더 파일에는 라이브러리(alibrary.lib).라이브러리는 정적 라이브러리(.lib)및 그것은 링크를 제대로 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 선언하고는 정의된 헤더 파일에(Vector3d.h).클래스 선언 후에,나는 십자가 기능입니다.

Lib 컴파일이 파일,그러나 링크를 단위 테스트 exe 내가 이 오류가 발생할 수 있습니다.

 flywindow.obj :error LNK2005: "class Vector3d __cdecl cross(class Vector3d const &,class Vector3d const &)" (?cross@@YA?AVVector3d@@ABV1@0@Z) already defined in fly.obj

어떤 아이디어가?

감사

도움이 되었습니까?

해결책

를 정의할 경우 무료(회원이 아닌 클래스)기능,그것은에서 정의된다.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);

}

오류가 발생하기 때문에 당신의 정의 기능에 헤더가 없지만,그것을 표시 인라인 요소입니다.는 경우에 당신은 지금에 포함하는 헤더로 두 개의 파일이 있는 별도로 컴파일,링커,하려고 할 때 링크를 컴파일한 오브젝트 파일을 것이다,던지는 오류기 때문에,그것은 그가 십자가 정의되는 함수다.

그것은 작동하지 않고 exlicitly 퍼팅에 대한 인라인 멤버의 기능 등이기 때문에,회원 기능을 정의되어 있는 클래스 정의는 암시적으로 인라인 요소입니다.

그것은 그러나,좋은 생각이 아닌 일반적으로 확인 함수 정의에서는 헤더가 있습니다.는 경우에 당신의 기능에 따라 다른 유형 단순 벡터(경우에 그것은 잘 이럴이지만,그것은 논쟁의 여지가있는 물론 어떤 사람들이 그것을 좋아하지 않음)하는 데 필요한 것입니다 당신은 헤더를 포함한 형식입니다.는 것이 불필요하게 팽창한 코드는 간접적으로 포함하여 귀하의 헤더가 있습니다.대신,그런 경우에 당신은 전적으로만 선언 함수의 내부 헤더:

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();

다른 팁

가장 가능성이 높은 설명은 포함 파일에 코드 (특히 크로스의 정의)가 있고 두 개의 소스 파일에 포함 된 파일이 포함되어 있으므로 이중 정의입니다.

헤더 파일에는 정의가 아닌 선언이 있어야합니다. 선언 (무언가 존재한다는 사실)은 Typedef, 클래스 선언, 열거 등과 같은 것들입니다.

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

크로스 기능은 헤더 파일에 선언해야합니다.

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

별도의 소스 파일에 정의됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top