2012-02-12 2 views
2

헤더 파일에 선언 된 테스트 클래스가 있고 별도의 파일에 정의되어 있습니다. 클래스는 Windows에서 다르게 컴파일해야하므로 #if defined (_WINDOWS_)을 사용합니다. #if defined (_WINDOWS_)도 포함하는 cpp 파일을 컴파일하면 다른 파일에 정의되어 있지만 심볼 _WINDOWS_이 정의되지 않은 것처럼 컴파일됩니다.컴파일 타임 기호는 # 정의되었지만 #ifdef에는 표시되지 않습니다.

Error Code : error lnk2019 unresolved external symbol public

소스 코드

Error Code : error lnk2019 unresolved external symbol public

참고

// test.h 

class Test 
{ 
public: 
#if defined (_WINDOWS_) 

void printwindow(); 
#endif 

void notwindows(); 
}; 

//test.cpp 

#include "test.h" 

#if defined (_WINDOWS_) 
void Test::printwindow() 
{ 
cout << "i am windows "; 
} 
#endif 


void test::notwindows() 
{ 
cout << " not windows " ; 
} 


//main.cpp 

#include "windows.h" 
#include "test.h" 

void main() 
{ 
test t1 ; 

t1.printwindow() // OK I have declared function so my _WINDOWS_ is available but when i run it i get 
} 
: 내가 코드를 컴파일 할 때, 나는 다음과 같은 오류를 얻고 내가 직접 함수를 정의 할 경우 어떤 문제

// test.h 

    class Test 
    { 
    public: 
    #if defined (_WINDOWS_) 

    void printwindow(){couT << "i am window" } 
    #endif 

    void notwindows(); 
    }; 
없이 작동

하지만이 방법이 마음에 들지 않습니다. 필자는 그것들을 별도의 파일 (h와 cpp)로 정의하는 것을 선호한다.

+0

죄송합니다.이 질문은 의미가 없습니다. –

+0

@CodyGray : 질문을하기 위해 기계 번역기를 사용해야했던 것 같습니다. 필자는 Windows에서 컴파일 할 때 특정 기능을 추가로 원합니다. – kkm

+0

이것이 실제 코드입니까? 그런 다음 누락 된'#include ','cout' 대신'couT' 사용,'using namespace std;'(또는 std :: cout 사용) 및't1 호출시 추가 콜론 . : printwindow()', 줄 끝 부분에 누락 된 세미 콜론은 컴파일하는 동안 모두 문제를 일으킨다. – tinman

답변

7

당신이 _WIN32 대신 _WINDOWS_를 사용하는 것이 더 좋을 것이다 귀하의 조건부 컴파일 테스트. _WINDOWS_windows.h이 포함 된 경우에만 정의되며 컴파일러는 포함 된 헤더에 관계없이 Windows 대상의 빌드에 대해 _WIN32을 자동으로 정의합니다. 사용자 환경에서 _WINDOWS_main.cpp을 컴파일 할 때 정의되지만 을 컴파일 할 때 정의되지 않으므로 test.cpp에는 windows.h이 포함되지 않습니다.

또한 _WINDOWS_ 매크로 정의는 windows.h 헤더의 구현 세부 사항이며 사용하도록 보장되지 않습니다. 예를 들어, windows.h의 MinGW 버전은 _WINDOWS_을 정의하지 않습니다.

3

당신은 당신이 정의 _WINDOWS_ 기호가없는 Test.cpp에를 컴파일 할 때 당신의 Test.cpp에 파일

에 WINDOWS.H를 포함해야합니다. 따라서 윈도우 기능이없는 오브젝트 파일을 생성합니다.

다음은 main.cpp에 windows.h를 포함했기 때문에 test.hpp에서 심볼을 사용합니다. 포함 순서를 변경하면 차별적으로 동작합니다. 포함 순서에 의존하지 않는 Windows 버전을 선택하는 방법을 다시 생각해보아야합니다 (예를 들어, _WIN32_에 대한 다른 응답 참조).

당신은 몇 가지 다른 코드 파일에 정의 이미 컴파일 된 객체 파일의 코드 (Test.cpp에) 사용 (MAIN.CPP)를 변경할 수 없습니다

관련 문제