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 (または -static が使用されている場合は libstdc++.a)。

libib.a にすべての C++ ライブラリを含めて、ユーザーが次のコマンドを使用してコンパイルできるようにしたいと考えています。

gcc -Ilib -Llib main.c -lib
4

1 に答える 1

0

Linuxでは、共有ライブラリは、その中の他の共有ライブラリもリンクすることで作成できます。だからあなたは

  1. すべてのソースコード(Cラッピングコードを含む)をファイルにコンパイル-fPIC*.pic.oます
  2. これらすべてのファイルを、必要なライブラリをリンクする共有ライブラリにマージします。

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

libmy.so次に、 asを使用するだけでgcc main.o -L. -lmy、他のライブラリがリンクされます。

たとえば、Parma Polyhedra Libraryを見てください。これには、C++でlibppl_c.soaをラップするinCがあります。依存ライブラリを一覧表示するために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)。代わりに共有ライブラリを構築してください。

静的ライブラリは単なるオブジェクトファイルのシーケンスであり、それ以上のものではないため、静的ライブラリで同等のことを行うことはできません。(あなたが夢見ている依存関係情報のためのメタデータスペースはありません)。

于 2012-08-30T12:52:33.500 に答える