2012-03-03 5 views
1

리눅스에서 빌드 할 라이브러리를 얻고 있습니다. 이것은 Windows에서 빌드 및 작동하지만 Linux에서는 정적 라이브러리를 사용할 때 라이브러리에 해결되지 않은 기호가 표시됩니다. 다음과 같이 코드가 나타납니다 :이 클래스의 .cpp 파일 내부정의되지 않은 기호는 .cpp 파일에 정의되어 있지만

class MyClass : public AnotherClassRefCounded 
{ 
public: 
    static bool queryInstance(MyClass **ppmyClass); 
}; 

나는이 : 이제

#include "stdafx.h" 
#include "MyClass.h" 

MyClass* MyClass::m_pInstance = NULL; 

bool MyClass::queryInstance(MyClass **myClass) 
{ 
    if(m_pInstance == NULL) 
    { 
    m_pInstance = new MyClass(); 
    m_pInstance->incRef(); 
    } 

    m_pInstance->incRef(); 
    *myClass = m_pInstance; 
    return true; 
} 

나는 다음과 같은 출력을 얻을 libMyLib.a에 nm -Cu를 실행하는 경우 :

[[email protected] libDebug]$ nm -Cu libMappingd.a | grep queryInstance 
       U AFewMoreScopes::MyClass::queryInstance(AFewMoreScopes::MyClass**) 

내 시스템 정보는 다음과 같습니다 :

[[email protected] libDebug]$ cat /etc/redhat-release ; gcc --version 
Red Hat Enterprise Linux Server release 6.1 (Santiago) 
gcc (GCC) 4.4.5 20110214 (Red Hat 4.4.5-6) 
Copyright (C) 2010 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. There is NO 
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 

저작권상의 이유로 동일한 코드를 게시 할 수 없습니다. 내 능력을 최대한 활용하여 코드를 재현했습니다. 정보가 누락되었다고 생각되면 주저하지 말고 요청하십시오. 빌드


UPDATE

예 :

...

g++ -c -include Mappingd -pipe -w -g -fPIC -Wall -W <DEFINE FLAGS> <INCLUDE FLAGS> -o MyClass.o MyClass.cpp 

...

ar cqs libMappingd.a <all object files> 

업데이트 0

이것은 매우 흥미 롭습니다. "MyClass에"에 대한 오브젝트 파일 내부 기호가 undefied되지 않습니다 그러나

MyClass.o: 
       <My Symbol Not Undefined> 

당신이 오브젝트 파일의 또 다른 하나에 가면 :

<Other Object>.o: 
       ... 
       U Scope::MyClass::queryInstance(Socpe::MyClass**) 

갱신 1

g++ -c -include Mappingd -pipe -w -g -fPIC -Wall -W -DLINUXx86 <DEFINE FLAGS> <INCLUDE FLAGS> -o MyClass.o MyClass.cpp 
g++ -c -include Mappingd -pipe -w -g -fPIC -Wall -W -DLINUXx86 <DEFINE FLAGS> <INCLUDE FLAGS> -o OtherClass.o OtherClass.cpp 
rm -f libMappingd.a 
ar cqs libMappingd.a <Other Objects> MyClass.o OtherClass.o 

g++ -c -include Mappingd -pipe -w -g -fPIC -Wall -W -DLINUXx86 <DEFINE FLAGS> <INCLUDE FLAGS> -o OtherClass.o OtherClass.cpp 
g++ -c -include Mappingd -pipe -w -g -fPIC -Wall -W -DLINUXx86 <DEFINE FLAGS> <INCLUDE FLAGS> -o MyClass.o MyClass.cpp 
rm -f libMappingd.a 
ar cqs libMappingd.a <Other Objects> OtherClass.o MyClass.o 

차이가 없습니다. 다른 라이브러리에서는 아직 정의되지 않은 기호가 표시됩니다.

+0

어떻게'libMappingd.a'을 만드나요? 명령 및 출력 결과를 게시하십시오. – jpalecek

+0

cpp 파일에서 'MyClass'가 'RuntimeEnvironment'로 변경되는 이유는 무엇입니까? – BatchyX

+0

Qt를 사용하여 정적 라이브러리를 작성하고 있습니다. 컴파일 문장에서 한 줄을 가져 오려면 잠깐만 기다려주세요. –

답변

0

많은 연구 끝에 RHEL 6.1의 아카이버에 버그가 있음을 발견했습니다. 정적 라이브러리를 직접 공유 동적 라이브러리로 가져 오려고하지 않고 대신 정적 라이브러리를 압축 해제하고 해당 객체 파일을 .so 파일로 직접 가져 왔습니다.이제 정적으로 연결되어 있지 않은 심볼과는 별도로 라이브러리에 정의되지 않은 심볼이 0 개 있습니다.

1

VC++와 GCC 사이의 주된 차이점은 링커에게주는 오브젝트 파일의 순서가 중요하다는 것입니다. 오브젝트 파일 A에서 사용되는 기호는 링크 순서에서 또는 그 다음에 정의되어야합니다.

MyClass.o를 개체 파일 목록의 끝으로 이동해보십시오.

+0

나는 ar이 확인하지 않고 모든 기호를 가져 왔다고 생각 했단 말인가? –

+0

@MatthewHoggan - 아카이버가 주문에 의존하는지 확실하지 않습니다. 링커를 사용할 때 ** 정적 라이브러리를 사용하면 오류가 발생한다고 말한 이후로 링커에 대해 이야기하고있었습니다. 최종 실행 파일/공유 라이브러리의 다른 곳에이 정의되지 않은 기호를 사용합니까? 그렇다면 나중에 목록에서 libMappingd.a를 이동하고 알려 주시면 답변을 업데이트 할 수 있습니다. – Asaf

+0

정의되지 않은 기호와 관련된 파일은 모두 매핑에 있고 매핑은 다른 모든 라이브러리에 종속됩니다. 따라서 먼저 나열됩니다. Qt 프로젝트 파일에서 복사 "LIBS + = \ -l 매핑 \ " –

관련 문제