Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将静态库链接到共享库_C++_Linker_Ld - Fatal编程技术网

C++ 如何将静态库链接到共享库

C++ 如何将静态库链接到共享库,c++,linker,ld,C++,Linker,Ld,我试图通过如下命令将静态库链接到共享库 g++ -shared obj.o archive.a -o libLib.so 但在运行时,我不断得到未解析的系统,这些系统应该在编译时从存档中链接。我试过了 g++ -shared obj.o -Wl,-Bstatic archive.a -Wl,-Bdynamic -o libLib.so 及 没有成功。我觉得我缺少了一些基本的东西…你实际上不能(也就是说,永远不应该)那样做。应该是,但静态库不是 如果您想将libaa链接到libfoo.so构

我试图通过如下命令将静态库链接到共享库

g++ -shared obj.o archive.a -o libLib.so
但在运行时,我不断得到未解析的系统,这些系统应该在编译时从存档中链接。我试过了

 g++ -shared obj.o -Wl,-Bstatic archive.a -Wl,-Bdynamic -o libLib.so

没有成功。我觉得我缺少了一些基本的东西…

你实际上不能(也就是说,永远不应该)那样做。应该是,但静态库不是

如果您想将
libaa
链接到
libfoo.so
构建或获取共享(PIC)库
libaa.so
,而不是静态(非PIC)库
libaa.a

因此,一个文件
foo1.cc
进入共享库
libfoo.So
应编译为

g++ -c -fPIC -Wall -O foo1.cc -o foo1.pic.o
g++ -Wall -O foo1.cc -o foo1.o
图书馆将链接为

g++ -shared foo1.pic.o foo2.pic.o -o libfoo.so 
您可以将另一个共享库
libsmilling.so
链接到
libfoo.so
中,例如,在上述命令中添加
-lsmiling
。但不能将库链接到静态库中,只需复制它们的成员即可

但是进入静态库
libfoo.a
的文件只是编译为

g++ -c -fPIC -Wall -O foo1.cc -o foo1.pic.o
g++ -Wall -O foo1.cc -o foo1.o
因此,当您从
libfoo.a
中提取
foo1.o
成员时,它不是PIC(这是非常低效的)

原则上,您可以将非PIC对象代码放入共享库中。在实践中,您永远不应该这样做,因为共享库的数量太大,无法达到共享库的目的。如果这样做,文本内存将无法共享,动态链接器将需要大量重新定位工作

内部代码。因此共享对象应为PIC,以允许ld.so在不同进程中的不同地址段执行mmap操作

因此,您可以找到一系列将静态库链接到共享库的命令,例如,使用
ar x
提取
libbar.a
的所有成员,然后将所有这些提取的
bar*.o
链接到
foo*.pic.o
,但这将是一个错误。不要将静态非PIC库或对象文件链接到PIC共享库

有关详细信息(重点是Linux),请阅读wikipage


一些非常少的静态库包含PIC代码,因为它们可以用来创建共享库。例如,我的Debian提供了
libc6 pic
包,其中提供了
/usr/lib/x86_64-linux-gnu/libc_pic.a
静态pic库-可用于构建
libc.so
-例如,如果我想将自己的
malloc
放入
libc.so
!-无需重新编译每个glibc源文件

您的第二次尝试看起来像是一个损坏的版本,实际上是为了从静态和共享对象的输入生成一个可执行文件。然而,你正试图输出一个共享对象,所以这是不相关的。哇!这可能是我在这个问题上看到的最完整的答案——thx!尽管如此,当我将用于归档的对象编译为PIC代码时,它会链接——但归档文件并不经常使用-fPIC编译