1

g++を使用してC++用の静的ライブラリにいくつかのSDLユーティリティクラスをグループ化しようとしています。私はubuntulinux11.10とgccversión4.6.1(Ubuntu / Linaro 4.6.1-9ubuntu3)を使用しています。arのバージョンは2.21.53.20110810です。

すべてのファイルが小さいので、私は現在ヘッダーファイルのみを使用しています。それが問題と関係がある場合に備えて、私はこれに言及しています。また、ほとんどのヘッダーは-lSDLを使用してオブジェクトコードにコンパイルされます(それが正しいか、関連性があるかどうかはわかりませんが、どちらの方法でも失敗します)。最後に、2つの異なるクラスの静的メンバーがいくつかあり、プロセスの最後のステップに含まれるように独自のファイルで定義されています(ODRに従うことを試みます)。

つまり、すべてのファイルがオブジェクトコードに正常にコンパイルされ、arを使用してアーカイブが作成されますが、メインファイルをコンパイルして、次のように新しいライブラリ(libDanGfx.aである私が作成しているアーカイブ)にリンクしようとすると、次のようになります。

g ++ -Wall -ansi -pedanticnewmain.cpp-L。-lSDL -lDanGfx

このエラーが発生します:

./libDanGfx.a:シンボルを読み取れませんでした:アーカイブにインデックスがありません。ranlibを実行して1つ追加します

これは、すべてのアーカイブとオブジェクトコードを削除した後でも発生します。

私はサイトを偵察しましたが、問題に対する答えはまだ見つかりませんでした。ranlibを使用してもまったく役に立ちませんでした。また、-m32をコンパイラにフィードしようとしましたが、それでも役に立ちませんでした。私は3つの異なるマシンで試しましたが、すべて失敗しました。

フランキー、私はこのアーカイブ全体を削除し、makefileを更新して、オブジェクトファイルとリンクすることを考えていますが、ここで何が起こっているのかを知り、その過程で少し学びたいと思っています。

多くの情報が欠落していると思われるので、念のため、すべてを含む.tar.gzファイルをアップロードしました(解凍してmakefileを試してください)。熟読するために、すべての.oファイルはobjectsディレクトリにあり、使用されるすべてのコマンドはmakefileで読み取ることができます。また、メインは画面にいくつかの無意味なものを表示する必要があります(スペースを節約するためにリソースファイルがアップロードされていないため、おそらく赤い四角です。もちろん、.oファイルと.aファイルも除外されます)。

このリンクからファイルにアクセスできます。

4

1 に答える 1

1

質問をもう一度読んでアーカイブを確認すると、ヘッダーファイルにコードしかありませんか?ただし、ライブラリを作成することはできません。ヘッダーファイルはソースファイルにインクルードするためのものであり、オブジェクトファイルにコンパイルするためのものではありません。

ヘッダーを宣言のみの適切なヘッダーファイルに分割し、定義(つまり実装)をソースファイルに入れます。ソースファイルを、ライブラリの作成に使用されるオブジェクトファイルにコンパイルします。

「実装」がなく、すべてのコードがヘッダーファイルにインラインである場合は、ライブラリを作成する必要はありません。必要なヘッダーファイルをインクルードするだけです。

于 2012-08-06T09:29:43.433 に答える