이미 존재하는 상당히 큰 프로젝트에서 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을 통해 몇 가지 가능성을 발견했지만 내 문제와 일치하는 것을 찾을 수 없었습니다.
누구나이 문제를 찾는 방법에 대한 아이디어가 있습니까?
컴파일러 버전? 어떻게 컴파일하나요? (게시하기에 충분할 정도로 짧은 makefile입니까?) 당신이 변경 한 유일한 것임을 확신시켜 줍니까? (즉,'-O1'을 꺼내면 다시 컴파일합니까?) – us2012
스레드 안전성과 오해의 소지가있는 이름 짓기 ('팩토리'는 실제로는 싱글 톤과 같은 것입니다.) 이외에도, 여러분이 보여준 코드에는 아무런 이의가 없습니다.'-O1'이 정말로 당신이 바꾼 유일한 것이라면, 이것은 잘 작동 할 것입니다. makefile에'factory.cpp'를 컴파일하지 않거나 최적화가 켜져있는 조건절이 없다면, 조금 어리석은 일이 될 수 있습니다. – Damon