2014-03-03 1 views
0

다른 링크 옵션을 시도하는 데 2 ​​일을 소비했지만 아무런 결과가 없으면 거의 모든 "정의되지 않은 참조"항목을 읽었습니다. 나는 필사적이다!이클립스 : C++ lib의 C++ lib에서 참조하는 C 코드는 정의되지 않은 참조가됩니다.

저는 Linux Red Hat 플랫폼에서 Eclipse 3.6.1 및 GCC 4.4.7을 사용하고 있습니다.

솔라리스 스튜디오 (작동하는 곳)에서 Eclipse로 큰 프로젝트를 이식하고 있습니다. transformations.c + .h 파일 - 순수 C 코드가 포함 된 C++ 정적 라이브러리 프로젝트 (예 : Common_Lib)가 있습니다.

이 transformations.h 파일이

#ifndef TRANSFORMATIONS_H_ 
#define TRANSFORMATIONS_H_ 

#ifdef __cplusplus 
extern "C" { 
#endif 

void foo(int *x); 

#ifdef __cplusplus 
} 
#endif 
#endif 

/* transformations.c */ 
#include "transformations.h" 

void foo(int *x) 
{ 
    /* calculations on x*/ 
} 

에 싸여 나는 transformations.h에서() foo는 호출 방법 Do_Transform()와 다른 C++ 정적 lib 디렉토리 프로젝트 (예를 들어 Factory_Lib)가 있습니다. 이 프로젝트는 제대로 구축되었습니다.

#ifndef FACTORY_H 
#define FACTORY_H 
#include "transformations.h" 

class CFactory 
{ 
    public: 
    void Do_Transform(int *x); 
}; 

// factory.cpp 
#include "factory.h" 

void CFactory::Do_Transform(int *x) 
{ 
    foo(x); 
} 

그리고 마지막 하나 - 실행 - foo를 호출 Factory_Lib의 Do_Transform(),()에 대한 호출 C++ 프로젝트 (예를 들어 노동자).

#include factory.h 

int main 
{ 
    CFactory fact = new CFactory(); 
    int x=0; 

    fact.Do_Transform(&x); 

    return 0; 
} 

근무 (연결) 건설 될 거부 "foo는에 정의되지 않은 참조()"가 나타납니다. foo는()에 대한 호출이 노동자의) (주에서 직접을 수행하는 경우

문제 이 표시되지 않습니다!

는 노동자 프로젝트에서 나는 등 추가 라이브러리없이 링커 에서 -l참조 된 프로젝트로, 설정 -> 링커 참조에, 참조 프로젝트에 Common_Lib을 참조하려고했습니다 나는 많은 조합을 시도했지만 성공하지 못했습니다.

작동하게하려면 어떻게해야합니까?!?!? 나는 아이디어가 부족하다.

미리 감사드립니다.

+0

맨 마지막에 transformations.h 파일에 #endif가 있습니까? – Pavenhimself

+0

물론 그렇습니다. – rainbringer

답변

0

다음과 같은 행운을 누릴 수 있습니다 : -lFactory -lCommon, 순서는 중요합니다.

+0

고마워요! 그게 내 문제를 해결 했어! 그러나 나는 왜 그런지 이해하지 못한다. 이 논리 뒤에있는 논리를 설명해 주시겠습니까? – rainbringer

0

Common_Lib 및 Factory_Lib 코드가 있으므로 공통 C++ 컴파일러를 사용하여 둘 다 컴파일하지 마십시오. 나는 두 libs를 C++ 라이브러리로 컴파일한다는 것을 의미한다. (코드 변환은 transformation.h의 extern "C"를 제거하는 것 이외에는 필요 없다.)

여기서 왜 extern이 필요한지 이해하지 못한다. 여기에는 C 컴파일러가 포함되어 있지 않습니다. 두 라이브러리 모두 C++입니다.

+0

Common_Lib는 C++ 프로젝트로 pure-C 파일 인 transformations.c를 포함합니다. 이 파일은 g ++ 대신 gcc로 컴파일됩니다. 이 코드는 C로만되어 있으며 C로만 남아 있어야합니다. – rainbringer

+0

작업자를 만드는 동안 두 아카이브에 링크했습니다. 다른 현명한 나는 문제를 보지 않는다. – Rohit