我有一小段代码依赖于许多静态库(a_1-a_n).我想将该代码打包到静态库中,并将其提供给其他人.
我的静态库,让我们称之为X,编译好.
我创建了一个使用X函数的简单示例程序,但是当我尝试将它链接到X时,我从库a_1 - a_n中得到许多关于丢失符号的错误.
有没有办法可以创建一个新的静态库,Y包含X和X所需的所有功能(a_1 - a_n中的选定位),这样我就可以为人们分配Y来链接他们的程序了吗?
更新:
我已经看过只是使用ar转储所有内容并制作一个mega-lib,然而,最终包含了许多不需要的符号(所有.o文件大约为700 MB,但是,静态链接的可执行文件是7 MB).有没有一种很好的方法只包括实际需要的东西?
这看起来与如何将多个C/C++库合并为一个密切相关?.
我有2个静态的Linux库,通过创建ar cr,libabc.a和libxyz.a.
我想将它们合并到一个静态库中libaz.a.
我怎样才能做到这一点.
我想创建一个合并的静态库,而不是让两个库都给应用程序的最终链接.
问题:是否可以使用.dll文件在linux上编译程序?
这是怎么回事: 这个.dll将用于编写来自第三方的某些专有软件的php扩展.
背景与研究:
我得到了一个名为的图书馆proprietary.lib.我很好奇,因为我之前从未见过.lib扩展,所以我打字:
file proprietary.lib
Run Code Online (Sandbox Code Playgroud)
输出是:
proprietary.lib: current ar archive
Run Code Online (Sandbox Code Playgroud)
我做了一些研究,发现它ar或多或少tar(事实上,我认为tar已经ar在大多数*nix环境中被替换).
在检查该ar联机帮助页时,我看到了该页面t option,其中显示了该存档内容的表格列表.凉.所以我键入:
ar t proprietary.lib
Run Code Online (Sandbox Code Playgroud)
得到:
proprietary.dll
proprietary.dll
... (snip X lines) ...
Run Code Online (Sandbox Code Playgroud) 要使用*.o文件在c ++/unix中创建库,我注意到我的项目中有两种不同的方式(遗留代码):
ar qc libgraphics.a *.o
ranlib libgraphics.a
Run Code Online (Sandbox Code Playgroud)
和
ld -r -o libgraphics.a *.o
Run Code Online (Sandbox Code Playgroud)
这两种方法有什么区别,哪种方法用于什么目的?
当我尝试编译两个不同的程序时,我遇到了似乎是同样的问题.他们每个人首先创建一个静态库,然后创建链接该库的主应用程序.我正在使用gcc 4.7.2在Mac OS Mavericks上工作.
计划1
这是我跑步时发生的事情make:
首先,库libfeat.a已创建,但我收到警告:
ar rc ../lib/libfeat.a imgfeatures.o utils.o sift.o kdtree.o minpq.o xform.o
ranlib ../lib/libfeat.a
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: warning for library: ../lib/libfeat.a the table of contents is empty (no object file members in the library define global symbols)
Run Code Online (Sandbox Code Playgroud)
然后,在编译应用程序时,它表示它不能使用该库,因为它不是为相同的体系结构(x86_64)构建的:
gcc -O3 -I../include `pkg-config --cflags opencv` `pkg-config --cflags gtk+-3.0` `pkg-config --cflags gsl` siftfeat.c -o ../bin/siftfeat -L../lib -lfeat `pkg-config --libs opencv` `pkg-config --libs gtk+-3.0` `pkg-config --libs gsl`
ld: warning: ignoring file ../lib/libfeat.a, file was built for archive …Run Code Online (Sandbox Code Playgroud) 假设我有三个C静态库,比如libColor.a,它依赖于*libRGB.*a,而后者依赖于libPixel.a.据说库libColor.a依赖于库libRGB.a,因为libColor.a中有一些对libRGB.a中定义的符号的引用.如何将所有上述库组合到一个独立的新libNewColor.a中?
独立意味着新库应该定义所有符号.所以在链接时我只需要给出-lNewColor.新库的大小应该是最小的,即它不应该包含libRGB.a中的任何符号,libColor.a等不使用它.我在ar命令中使用了各种选项来试运气(用于创建和更新静态库/档案) ).
我确实阅读了man文件,但它没有帮助."rcs"似乎是传递给ar的最受欢迎的选项,但其含义并不是那么清楚.
所以"c"意味着创建一个新的档案,但为什么要使用"r"?哪个似乎代表"替换"?"s"选项对输出的作用是什么?
如果在一个构建脚本中构建静态库,并且想要在链接最终可执行文件时使用这些静态库,则提示.a文件的顺序非常重要:
g++ main.o hw.a gui.a -o executable
Run Code Online (Sandbox Code Playgroud)
如果gui.a使用hw.a链接中定义的内容将失败,因为在hw.a处理时,链接器尚不知道稍后需要该定义,并且不将其包含在is.generated可执行文件中.与连接线手动摆弄周围是不实际的,所以解决方案是使用--start-group和--end-group它通过库使得连接器运行两次,直到没有未定义的符号被发现了.
g++ main.o -Wl,--start-group hw.a gui.a -Wl,--end-group -o executable
Run Code Online (Sandbox Code Playgroud)
然而,GNU ld手册说
使用此选项会产生显着的性能成本.最好只在两个或多个档案之间存在不可避免的循环引用时才使用它.
所以我认为最好把所有.a文件放在一个.a带有索引(-sGNU ar选项)的文件中,该文件说明文件需要链接的顺序.然后只给出一个.a文件g++.
但我想知道这是否比使用组命令更快或更慢.这种方法有什么问题吗?我也想知道,有没有更好的方法来解决这些相互依赖问题?
编辑:我编写了一个程序,它接受一个.a文件列表并生成一个合并.a文件.使用GNU通用ar格式.将LLVM的所有静态库打包在一起就像这样工作
$ ./arcat -o combined.a ~/usr/llvm/lib/libLLVM*.a
Run Code Online (Sandbox Code Playgroud)
我将速度与.a手动解.a压缩所有文件进行比较,然后使用ar重新计算索引将它们放入新文件中.使用我的arcat工具,我获得大约500毫秒的一致运行时间.使用手动方式,时间变化很大,大约需要2秒.所以我认为这是值得的.
代码就在这里.我把它放到公共领域:)
我在xCode中创建了一个静态库项目,并构建了一个名为mylib.a的.a.有一些代码( .m文件)和另一个名为common.a的静态lib文件通知静态库nylib.a.但我怀疑,如果普通的竞争是真的包装在mylib.a中.那么如何在mac OS中观察mylib.a的内容呢?我知道有一些命令如ar,nm可以在Linux中完成这项任务.但它不能在mac OS中运行.
我有两个文件37064544_p1.cpp,37064544_p2.cpp内容相同,如下所示:
int add(int x,int y)
{
return x+y;
}
Run Code Online (Sandbox Code Playgroud)
我用它们编译了它们
g++ -c 37064544_p2.cpp -o 37064544_p2.o
g++ -c 37064544_p2.cpp -o 37064544_p2.o
Run Code Online (Sandbox Code Playgroud)
并使用将它们添加到存档中
ar -rsc lib37064544pf.a 37064544_p1.o 37064544_p2.o
Run Code Online (Sandbox Code Playgroud)
和
$ nm -s lib37064544pf.a
Run Code Online (Sandbox Code Playgroud)
给我 :
Archive index:
_Z3addii in 37064544_p1.o
_Z3addii in 37064544_p2.o
37064544_p1.o:
0000000000000000 T _Z3addii
37064544_p2.o:
0000000000000000 T _Z3addii
Run Code Online (Sandbox Code Playgroud)
和
$ ar -t lib37064544pf.a
Run Code Online (Sandbox Code Playgroud)
给我
37064544_p1.o
37064544_p2.o
Run Code Online (Sandbox Code Playgroud)
我有一个驱动程序,它调用_Z3addii编译的函数
g++ -static 37064544driver.cpp -o 37064544driver.elf -L. -l37064544pf
Run Code Online (Sandbox Code Playgroud)
结果是
Sum : 11
Run Code Online (Sandbox Code Playgroud)
问题
符号是如何_Z3addii解决的?