我正在编写一款跨平台的应用程序,该程序不兼容GNU GPL许可证。目前我面临的主要问题是该应用程序与glibc和libstdc++动态链接,而几乎每次库的新版本更新都不向后兼容,因此我的应用程序会出现随机崩溃。
为了解决这个问题,我分发已经在几个不同的系统上(使用不同的C/C++运行时版本)编译过的应用程序二进制文件。但我想避免这样做。所以我的问题是,在考虑许可证和其他一切情况的前提下,我能否静态链接glibc和libstdc++?这样做会导致rtld出现问题吗?
我正在编写一款跨平台的应用程序,该程序不兼容GNU GPL许可证。目前我面临的主要问题是该应用程序与glibc和libstdc++动态链接,而几乎每次库的新版本更新都不向后兼容,因此我的应用程序会出现随机崩溃。
为了解决这个问题,我分发已经在几个不同的系统上(使用不同的C/C++运行时版本)编译过的应用程序二进制文件。但我想避免这样做。所以我的问题是,在考虑许可证和其他一切情况的前提下,我能否静态链接glibc和libstdc++?这样做会导致rtld出现问题吗?
你不需要这样做。
将你链接程序所需的原始库复制到应用程序文件夹中的一个目录(例如../lib)中。
比如:
my_app_install_path
将你的应用程序重命名为类似app.bin的名称。编写一个小的Shell脚本,它将环境变量LD_LIBRARY_PATH设置为库路径(如果有任何前置条件,则将其连接起来)。现在,ld应该能够找到你链接的动态库,而你不需要将它们静态地编译到可执行文件中。
请记住遵守LGPL许可证,将给定的归属信息添加到库中,并在文档中指出源代码可以下载的位置。
-static-libgcc
给链接器,如果系统上有可用的C库静态版本,则链接器将链接到该静态版本。否则它会被忽略。libgcc != libc
(无论libc == glibc
与否)。libgcc
是一个运行时库,用于支持编译器生成的代码。在这里阅读有关它的信息:https://gcc.gnu.org/onlinedocs/gccint/Libgcc.html。 - 0xC0000022Lobjdump -T [二进制文件路径]
来查看是否动态加载了libstdc++.so
。对于Golang程序员,在导入"C"之前,您可以添加#cgo linux LDFLAGS: -static
。 - bronze man我必须质疑你对这些可怜的库函数在做什么?
我也有一些跨平台软件。它在各种Linux系统上都能正常运行。使用你想要支持的最旧版本的软件进行构建。glibc和libstdc++库非常向后兼容。
我曾在CentOS 4上构建并在RHEL 6 beta上运行,没有问题。 我可以在稳定的Debian上构建并在测试中运行。
现在,如果我尝试在旧的Debian上构建并在CentOS 5.4上运行,有时候会遇到一些库的问题。这通常是由于不同的发行版配置选择造成的,比如选择线程或非线程。