2013-03-20 1 views
5

이미 존재하는 상당히 큰 프로젝트에서 gcc 컴파일러 최적화 O1을 사용하도록 설정했습니다.O1 최적화를 사용할 때 C++ 링커 오류가 발생했습니다.

이 옵션을 사용하지 않으면 모든 것이 빌드되고 링크되며 정상적으로 실행됩니다. 옵션을 사용하면 주 실행 파일이 컴파일되고 링크되지만 단위 테스트 중 하나를 링크 할 때 링커 오류가 발생합니다.

이 두 컴파일 사이에서 코드를 변경하거나 파일을 만들지 않고 O1 최적화 플래그 만 사용했습니다. 내가 할

오류 : 어딘가에 연결 과정

Configuration.a(Builder.o): In function `Builder::Create() const': 
Builder.cpp:123: undefined reference to `Factory::Instance()' 

, 그것은이 줄을 발견 Builder.cpp의 (라인 123) : CPP 파일

pObject = Factory::Instance()->CreateObject(); 

(링커 오류 게다가 Instance 함수 중 하나를 얻으려면 CreateObject 함수에서 하나를 얻습니다.

헤더 파일을

class Factory { public: 
    static Factory* Instance(); << rest of the file >> 

을 그리고 CPP 파일

Factory* Factory::sInstance = 0; 

Factory* Factory::Instance() { 
    // Check if this is the first call 
    if (sInstance == 0) 
    { 
     // Create only instance 
     sInstance = new Factory(); 
    } 

    // Address of the instance 
    return sInstance; } 

에 먼저 나는 깨끗하고 다시 시도하지만 아무 짓도 안 했어요 : 전자 Factory, 난을 참조하십시오. 또한 nm을 사용하여 Factory.o (하나는 최적화하지 않고 하나는 사용 된 심볼)의 덤프를 만들고이를 비교했습니다.

일부 기호는 제거되었지만 Factory::Instance() 기호는 제거 된 것을 볼 수 있습니다. 이 기능과 관련하여 주소가 변경된 것을 볼 수 있지만 문제는 아닌 것으로 예상됩니다.

또한 Google을 통해 몇 가지 가능성을 발견했지만 내 문제와 일치하는 것을 찾을 수 없었습니다.

누구나이 문제를 찾는 방법에 대한 아이디어가 있습니까?

+2

컴파일러 버전? 어떻게 컴파일하나요? (게시하기에 충분할 정도로 짧은 makefile입니까?) 당신이 변경 한 유일한 것임을 확신시켜 줍니까? (즉,'-O1'을 꺼내면 다시 컴파일합니까?) – us2012

+0

스레드 안전성과 오해의 소지가있는 이름 짓기 ('팩토리'는 실제로는 싱글 톤과 같은 것입니다.) 이외에도, 여러분이 보여준 코드에는 아무런 이의가 없습니다.'-O1'이 정말로 당신이 바꾼 유일한 것이라면, 이것은 잘 작동 할 것입니다. makefile에'factory.cpp'를 컴파일하지 않거나 최적화가 켜져있는 조건절이 없다면, 조금 어리석은 일이 될 수 있습니다. – Damon

답변

1

Configuration.a (Builder.o) : 기능 Builder::Create() const': Builder.cpp:123: undefined reference to 공장 :: 인스턴스() '에서이

당신은 Factory::Instance()Factory.o에 정의되어 있는지 확인하고 한 이후 당신은 분명히 있기 때문에 아카이브 라이브러리를 사용하여, 내 수정 구슬은 Factory.o전에Configuration.a 앞에 있고, 이후에이되어야 함을 나타냅니다.

명령 행 matters의 아카이브 라이브러리 순서.

관련 문제