2012-08-30 41 views
0

我需要爲包裝我的C++庫的C代碼創建封裝器庫。有沒有辦法以這種方式創建包裝器庫,以便用戶只需鏈接此包裝器庫,並且不必在鏈接器命令行中包含所有(C++)庫?創建靜態庫時嵌入所有外部引用

我的測試項目的結構是這樣的:

. 
├── lib 
│   ├── cpp 
│   │   ├── print.cc 
│   │   └── print.h 
│   ├── lib.cc 
│   ├── lib.h 
└── main.c 

的main.c中是使用我的圖書館爲例C應用程序。 lib.h和lib.cc文件是包含C綁定的包裝庫。我的C++庫駐留在cpp子文件夾中。

目前,我有它通過使用下面的命令鏈的工作:

cd lib 
g++ -c lib.cc 
ar rcs libib.a lib.o 
cd .. 
gcc -Ilib -Llib main.c -lib -lstdc++ 

然而,正如你可以看到用戶的連接步驟需要包括在我的C++庫使用的C++庫。在這種情況下,使用libstdC++。so(或使用libstdC++。a if -static)。

我想包括我libib.a使得用戶可以簡單地使用下面的命令編譯所有的C++庫:

gcc -Ilib -Llib main.c -lib 
+0

你應該製作共享庫(不是靜態的),看我的答案。 –

回答

0

在Linux上,共享庫可以通過鏈接也等進行內部共享庫。所以,你可以

  1. 編譯與-fPIC所有的源代碼(包括C封裝代碼)爲*.pic.o文件
  2. 合併所有這些文件到一個共享庫連接需要的庫,例如

    g++ -shared *.pic.o -o libmy.so -lQt -lrt -lstdc++

然後你可以使用你簡單地作爲libmy.sogcc main.o -L. -lmy這將鏈接的其他庫。

Parma Polyhedra Library爲例,它在C中有一個libppl_c.so,用C++包裝libppl.so。使用ldd列出依賴庫:

% ldd /usr/lib/x86_64-linux-gnu/libppl_c.so.4 
linux-vdso.so.1 => (0x00007fffa17cf000) 
libppl.so.9 => /usr/local/lib/libppl.so.9 (0x00007fcfec5f1000) 
libpwl.so.5 => /usr/local/lib/libpwl.so.5 (0x00007fcfec3ed000) 
libgmpxx.so.4 => /usr/lib/x86_64-linux-gnu/libgmpxx.so.4 (0x00007fcfec1c5000) 
libgmp.so.10 => /usr/lib/x86_64-linux-gnu/libgmp.so.10 (0x00007fcfebf56000) 
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fcfebc4f000) 
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fcfeb9cc000) 
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fcfeb645000) 
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fcfeb42f000) 
libgmp.so.3 => /usr/lib/libgmp.so.3 (0x00007fcfeb1d2000) 
/lib64/ld-linux-x86-64.so.2 (0x00007fcfecf11000) 

這是在Debian/SID/AMD64

一般建議是避免生成靜態庫(使用ar和可能ranlib)。改爲建立共享庫。

你不能在靜態庫上做同樣的事情,因爲靜態庫僅僅是一系列對象文件,僅此而已。 (您夢想的依賴信息沒有元數據空間)。