他の静的ライブラリを使用する静的ライブラリの作成について質問があります。
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