Saya mempunyai pertanyaan tentang membuat perpustakaan statis yang menggunakan perpustakaan statis lainnya.
Saya membuat contoh dengan 3 file - main.cpp, slib1.cpp dan slib2.cpp. slib1.cpp dan slib2.cpp keduanya dikompilasi sebagai perpustakaan statis individual (misalnya saya berakhir dengan slib1.a dan slib2.a) main.cpp dikompilasi menjadi ELF standar yang dapat dieksekusi yang terhubung dengan kedua perpustakaan.
Ada juga a file header bernama main.h yang membuat prototipe fungsi di slib1 dan slib2.
main.cpp memanggil fungsi yang disebut lib2func() dari slib2. Fungsi ini pada gilirannya memanggil lib1func() dari slib1.
Jika saya mengkompilasi kode apa adanya, g++ akan kembali dengan kesalahan linker yang menyatakan bahwa ia tidak dapat menemukan lib1func() di slib1. Namun, jika saya melakukan panggilan ke lib1func() SEBELUM panggilan apa pun ke fungsi apa pun di slib2, kode akan dikompilasi dan berfungsi dengan benar.
Pertanyaan saya hanyalah sebagai berikut: apakah mungkin membuat perpustakaan statis yang bergantung pada perpustakaan statis lain? Tampaknya ini merupakan batasan yang sangat berat jika hal ini tidak memungkinkan.
Kode sumber untuk masalah ini terlampir di bawah:
utama.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;
}
keluaran gcc (dengan baris yang dikomentari):
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
keluaran gcc (dengan baris tidak dikomentari)
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