我需要创建一个封装我的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 ++。所以(或的libstdc ++ a。如果-static被使用)。
我想包括我libib.a使得用户可以简单地使用下面的命令编译所有的C ++库:
gcc -Ilib -Llib main.c -lib
在Linux上,共享库可以通过链接也里面他们的其他共享库进行。 所以,你可以
- 编译所有的源代码(包括C包裹代码)
-fPIC
入*.pic.o
文件 合并所有这些文件到一个共享库连接需要的库,例如
g++ -shared *.pic.o -o libmy.so -lQt -lrt -lstdc++
然后,你可以简单地使用你的libmy.so
作为gcc main.o -L. -lmy
gcc main.o -L. -lmy
这将链接的其他库。
寻找例如在帕尔马多面体库 ,它有一个libppl_c.so
用C包装一libppl.so
在C ++。 使用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
)。 建立共享库来代替。
你不能做静态库等价的东西,因为一个静态库是简单对象文件,仅此而已的序列。 (没有为依赖信息没有元数据的空间你梦想)。