链接静态库而不是使用g ++共享

时间:2018-01-08 11:36:55

标签: linux g++ static-libraries

我创建静态库并链接.hoverBorderWrapper > img { filter: grayscale(100%) } .cftoverlay:hover + .hoverBorderWrapper > img { filter: grayscale(0%) } 。 我使用静态库编译programm,但programm有一些共享库的依赖

main.cpp

修改

我尝试编译我的程序,它只使用静态库。 libstdc++.so.6 => /usr/lib32/libstdc++.so.6 (0xf75c1000) libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xf756a000) libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xf754c000) libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf7394000) libz.so.1 => /lib/i386-linux-gnu/libz.so.1 (0xf7379000) libssl.so.1.1 => /usr/lib/i386-linux-gnu/libssl.so.1.1 (0xf730b000) libcrypto.so.1.1 => /usr/lib/i386-linux-gnu/libcrypto.so.1.1 (0xf70a4000) libev.so.4 => /usr/lib/i386-linux-gnu/libev.so.4 (0xf7094000) libuv.so.1 => /usr/lib/i386-linux-gnu/libuv.so.1 (0xf706c000) libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xf704f000) 是我编译的静态库。

libHermite.a

我的输出:

g++ -o HermitesPolynomialCleanLx-x64 main.cpp -static -L/home/mnowak/projects/HermitesPolynomialLxClean/lib -lHermite -lwebsockets -lstdc++ -lpthread -lssl -lcrypto -ldl -luv -lev -lgcc -lc -Wall -Wextra -pedantic -pthread

1 个答案:

答案 0 :(得分:1)

  

如何编译程序,以便动态库链接在我构建的静态库中。

这是不可能的。共享库(实际上)position-independent code,但静态库(通常)没有。另请参阅this回答一个非常相关的问题。

阅读Drapper的论文How To Write Shared Libraries

我建议像大多数人一样制作共享库,可能链接到其他共享库。有很多很好的理由喜欢共享库。

或(通常不推荐)创建静态库并要求您的用户静态链接其他依赖库(不推荐)。例如link也是你的&他们的可执行文件-Bstatic

  

我想,我的程序只使用没有外部依赖的静态库。

这通常是一个错误的愿望(闻起来很糟糕像某些XY problem)。您应该更喜欢系统地使用共享库(出于多种原因,例如阅读Program Library HowTo),就像Linux发行版的大多数程序一样。例如,在我的/usr/bin/中的6249个可执行文件中,只有一个go-md2man是静态链接的。

在2018年,静态链接可执行文件的原因很少(通常,只有少数低级系统实用程序在系统崩溃之后需要静态链接才能使用,并且它们大多位于/sbin/之下)。

BTW,您的软件看起来像使用一些加密技术。这是动态链接它的非常好的原因:您希望您的用户尽快从libcrypto.solibssl.so中的任何错误更正中获利(例如,当他的Linux时分发正在更新这些)。

(所以我认为静态链接的加密程序本身就存在安全风险)

要处理依赖关系,请使用package manager并释放您的内容,例如一些.deb package。但是你可能只是传输软件的源代码,它通常更简单(让你的用户重建它)。