2012-03-03 8 views
1

私はライブラリをlinuxでビルドすることに取り組んでいます。これはWindowsで構築され動作しますが、Linuxでは静的ライブラリを使用するときに私のライブラリに未解決のシンボルが表示されています。次のようにコードが表示されます。定義されていないシンボルは、.cppファイルで定義されていますが、

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

私が持っているこのクラスの.cppファイル内部:

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

#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]$ 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> 

UPDATE 0

これは非常に興味深いです。 "MyClassの" 用のオブジェクトファイル内のシンボルがundefiedされていません。しかし、

MyClass.o: 
       <My Symbol Not Undefined> 

を使用すると、オブジェクトファイルの別の1に行く場合:

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

UPDATE1

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

私はちょうどチェックなしですべてのシンボルを引っ張ったと思った? –

+0

@MatthewHoggan - アーカイバが注文に依存しているかどうかは確かに分かりません。リンカを使用しているときに**静的ライブラリを消費するときにエラーが発生すると言ったので、リンカについて話していました。この未定義のシンボルは、最終実行ファイル/共有ライブラリのどこかで使用しますか?もしそうなら、libMappingd.aをリストの後ろに移動して、私の答えを更新できるように私に知らせてください。 – Asaf

+0

未定義のシンボルに問題があるファイルは両方ともマッピングにあり、マッピングは他のすべてのライブラリに依存しています。したがって、最初にリストされます。 Qtプロジェクトファイルからのコピー "LIBS + = \ -lマッピング\ <他のすべてのライブラリ>" –

関連する問題