2009-04-30 5 views
4

비슷한 문제를 보았지만 내 문제를 해결하는 데 도움이되지 않았습니다.링커 오류 : 정의되지 않은 참조 C++

저는 C++로 프로젝트를 만들고 컴파일, 링크 및 실행하기 위해 UNIX에서 작업하고 있습니다. 내 특정 문제는 별도의 파일에 선언하는 메서드에 대한 정의되지 않은 참조입니다.

int SharedCache::replaceLine(ullong address){ 
    int evictPID = -1; 

    int cacheSet = calcCacheSet(address); 
    //random uniformly-distributed value for cache line 
    float numLines = static_cast<float>(CACHE_LINES_PER_SET); 
    uint cacheLine = static_cast<uint>(uniformDistr(numLines)); 

    if(cache[cacheSet][cacheLine] != NULL){ 
     evictPID = cache[cacheSet][cacheLine]->PID; 
    } 

    uint PID= calcPID(address); 
    uint tag= calcTag(address); 

    cache[cacheSet][cacheLine]->setLine(PID, tag); //mutex method 

    return PID; 
} 

라인 uint cacheLine = static_cast<uint>(uniformDistr(numLines)); 내가 다른 파일에서 사용하려는 함수를 호출한다 : 파일 SharedCache.cpp에서

, 나는 다음과 같은 방법이있다. 링커 오류는이 메서드에 대한 정의되지 않은 참조입니다.

uniformDistr (float); distributions.h 헤더에 선언되어 있으며 distributions.cpp에 정의되어 있습니다. 내 프로젝트 옵션에서 필자는 링커 플래그 -distributions를 설정하고 distributions.cpp를 컴파일하여 distributions.o 파일이 링크되어 있는지 확인했습니다.

여기에서 문제가 해결되지 않았기 때문에 어디로 가야할지 모르겠다.

+0

C++은 정상적으로 보입니다. 링커 오류는 종종 실수를 의미합니다.Makefile을 올리시겠습니까? –

+0

Makefile은 오버플로 텍스트 포맷으로 포맷하는 것이 매우 길고 쉽지 않습니다. 여전히 도움이된다고 생각한다면 –

답변

2

저는 KDevelop를 사용하지 않았습니다. 그러나 명령 행에서 연결 프로세스의 입력 파일로 distributions.o를 추가하기 만하면됩니다. 대시 나 .o 확장자를 사용하지 않아도됩니다.

또는 distributions.cpp를 KDevelop 프로젝트에 추가 할 수 있습니까? 그렇게하면 자동으로 컴파일되고 링크되어야합니다 (Visual Studio 또는 Eclipse와 같은 방식으로 작동하는 방식입니다).

+0

* 한숨 *이 프로젝트에 있다고 생각했지만 그렇지 않다고 생각합니다. 그것이 내가 비행 중에 KDevelop를 집어 들기 위해 얻은 것입니다. 죄송합니다. –

0

당신의 makefile에 distributions.cpp를 추가 했습니까? 또한 필요한 링커 플래그는 -ldistributions이라고 생각합니다.

+0

-ldistributions를 시도해 보았습니다. -distributions가 구성 오류를 일으키지 않았기 때문에 구성 오류가 발생했습니다. 나는 그것이 그럴 것이라고 생각하지 않는다. 또한, makefile을 다루는 KDevelop를 사용하고 있습니다. 나는 그것이 makefile을 다시 만들도록 시켰지만, distributions.cpp를 추가 할 정확한 장소가 없다. –

3

컴파일러/링커 명령이 호출 된 정확한 정보와 정확한 오류 출력이 없으면 좋은 답변을 제공하기가 어렵습니다.

그러나 사용자가 수행 한 작업에 대한 설명에서 distributions.o을 링커에 전달하지 않는 것으로 보입니다. 컴파일러/링커가 자동으로 링크 할 오브젝트 파일을 검색하는 다른 언어와 달리 C++ 링커는 함께 링크 할 객체의 명시 적 사양을 요구합니다.

여기 -ldistributions의 사용이 잘못되었습니다 : 다른 오브젝트 파일을 지정하려는 반면 -l 플래그는, 정적 또는 동적 라이브러리 (각각 .A 및 Linux .so를 파일)에 연결하는 데 사용됩니다 링커에서 고려해야합니다. -ldistributions을 지정하면 링커가 표준 라이브러리 위치에서 distributions.a 또는 distributions.so을 찾습니다. ,

gcc -o my_program SharedCache.o -ldistributions 

가 올바르게 다시 (같은 모양 만들 필요에 분포 코드를 연결하려면 :

는 기본적으로, 당신의 링커 호출은 이제 (아마도 더 많은 플래그 및 라이브러리와) 같이 보입니다 아마) 진짜에 비해없는 많은 플래그 및 라이브러리 :

gcc -o my_program SharedCache.o distributions.o 

이 누락 된 귀하의 문제를 해결하고 작업 바이너리 (또는 적어도 다른 오류를 ;-))을 생성한다. KDevelop에서 이것을하는 방법 그러나 나는 모른다.