2

他の静的ライブラリを使用する静的ライブラリの作成について質問があります。

main.cpp、slib1.cpp、slib2.cpp の 3 つのファイルを使用してサンプルをセットアップしました。slib1.cpp と slib2.cpp はどちらも個別の静的ライブラリとしてコンパイルされます (たとえば、最終的に slib1.a と slib2.a になります)。main.cpp は、両方のライブラリにリンクされた標準の ELF 実行可能ファイルにコンパイルされます。
slib1 と slib2 の関数のプロトタイプを作成する main.h という名前のヘッダー ファイルもあります。

main.cpp は、slib2 から lib2func() という関数を呼び出します。この関数は、slib1 から lib1func() を呼び出します。

コードをそのままコンパイルすると、g++ は、slib1 に lib1func() が見つからないというリンカー エラーを返します。ただし、slib2 の関数を呼び出す前に lib1func() を呼び出すと、コードはコンパイルされ、正しく動作します。

私の質問は次のとおりです。別の静的ライブラリに依存する静的ライブラリを作成することは可能ですか? これが不可能な場合、非常に厳しい制限のように思えます。

この問題のソース コードを以下に添付します。

main.h:

#ifndef MAIN_H
#define MAIN_H

int lib1func();
int lib2func();

#endif

slib1.cpp:

#include "main.h"

int lib1func() {
  return 1;
}

slib2.cpp:

#include "main.h"

int lib2func() {
  return lib1func();
}

main.cpp:

#include <iostream>
#include "main.h"

int main(int argc, char **argv) {
  //lib1func();  // Uncomment and compile will succeed.  WHY??

  cout << "Ans: " << lib2func() << endl;
  return 0;
}

gcc の出力 (行をコメントアウト):

g++ -o src/slib1.o -c src/slib1.cpp
ar rc libslib1.a src/slib1.o
ranlib libslib1.a
g++ -o src/slib2.o -c src/slib2.cpp
ar rc libslib2.a src/slib2.o
ranlib libslib2.a
g++ -o src/main.o -c src/main.cpp
g++ -o main src/main.o -L. -lslib1 -lslib2
./libslib2.a(slib2.o): In function `lib2func()':
slib2.cpp:(.text+0x5): undefined reference to `lib1func()'
collect2: ld returned 1 exit status

gcc 出力 (行のコメントを外した状態)

g++ -o src/slib1.o -c src/slib1.cpp
ar rc libslib1.a src/slib1.o
ranlib libslib1.a
g++ -o src/slib2.o -c src/slib2.cpp
ar rc libslib2.a src/slib2.o
ranlib libslib2.a
g++ -o src/main.o -c src/main.cpp
g++ -o main src/main.o -L. -lslib1 -lslib2

$ ./main 
Ans: 1
4

2 に答える 2

3

試してみてくださいg++ -o main src/main.o -L. -Wl,--start-group -lslib1 -lslib2 -Wl,--end-group

で定義されたグループは、ライブラリ間の循環依存関係を解決するの--start-group--end-group役立ちます。

参照: GCC: --start-group および --end-group コマンドラインオプションとは?

于 2012-06-19T21:07:50.227 に答える
2

順番が違います。gcc(1)これはマニュアルページからのものです:

It makes a difference where in the command you write this option; the linker searches and processes libraries and object files in the order they are specified. Thus, foo.o -lz bar.o searches library z after file foo.o but before bar.o. If bar.o refers to functions in z, those functions may not be loaded.
于 2012-06-19T21:10:47.450 に答える