私はライブラリを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
他のライブラリに未だ定義されていないシンボルが残っています。
どのように 'libMappingd.a'を作成しますか?コマンドとその出力をポストします。 – jpalecek
なぜあなたのcppファイルで 'MyClass'が 'RuntimeEnvironment'に変更されましたか? – BatchyX
私はQtを使って静的ライブラリを構築しています。コンパイル文から一行を得るために私に秒を与えてください。 –