Perpustakaan Statis yang bergantung pada perpustakaan statis lainnya

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

person knelson    schedule 19.06.2012    source sumber


Jawaban (2)


Silakan coba g++ -o main src/main.o -L. -Wl,--start-group -lslib1 -lslib2 -Wl,--end-group.

Grup ditentukan dengan --start-group, --end-group membantu menyelesaikan ketergantungan melingkar antar perpustakaan.

Lihat juga: GCC: apa itu --start-group dan --opsi baris perintah grup akhir?

person Ruben    schedule 19.06.2012

Urutan membuat perbedaan. Berikut ini dari halaman manual 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.
person Nikolai Fetissov    schedule 19.06.2012
comment
Bahkan dimungkinkan adanya ketergantungan melingkar antar perpustakaan. Dalam kasus seperti itu, Anda perlu menyediakan salah satu perpustakaan dua kali pada baris perintah. - person Tamás Szelei; 20.06.2012
comment
Atau gunakan opsi tautan seperti yang disarankan @Ruben. - person Nikolai Fetissov; 20.06.2012