使用 gcc 在 C++ 程序中静态包含 libc,而不使用 -static 选项

问题描述 投票:0回答:1

我正在尝试构建一个具有尽可能少的动态依赖项的小型 C++ 程序。 我面临的问题是我尝试构建的程序与 libmariadbcpp 具有动态依赖关系(无法静态链接)。

即在编译命令中使用 -static 选项会导致编译失败,并出现错误

/usr/bin/ld:尝试静态链接动态对象`/usr/local/lib/../lib/libmariadbcpp.so'

目前程序是使用命令构建的

gcc main.cpp -o main -lmariadbcpp

但是在 main 上运行 ldd 显示了与 libc.so.6、libm.so.6 等的依赖关系...

显然是命令

gcc main.cpp -o main -lmariadbcpp -static

不起作用,因为-static覆盖了-lmariadbcpp,但“逻辑上”类似于我想要实现的目标。

我尝试使用 -static-libstdc++ 但对生成的二进制文件没有明显的影响(libc 和 libm 仍然由 ldd 列出)。

有没有办法静态编译我的程序,以便 ldd 不会列出除 libmariadbcpp 之外的动态依赖项?

额外问题:-static-libstdc++ 等选项在哪里定义?我尝试使用 gcc 和 ld 的 --help 来查找它们,但没有成功。

非常感谢!

c++ gcc ld dynamic-linking
1个回答
0
投票

有没有办法静态编译我的程序,以便 ldd 不会列出除 libmariadbcpp 之外的动态依赖项?

没有。

如果您正在使用任何共享库,那么您必须还使用ld-linux.so

libc.so

事实上,运行

ldd /usr/local/lib/libmariadbcpp.so

 会同时显示 
libc.so.6
ld-linux
,因此无论如何,你的 
main
 将始终具有这些依赖项。

附注

http://xyproblem.info 可能与此处相关。

© www.soinside.com 2019 - 2024. All rights reserved.