为什么不能使用 GCC 生成静态二进制文件
Why cannot generate static Binary with GCC
我正在尝试使用 GCC 在 ubuntu 上编译可能的代码,我想将代码作为独立代码运行,这是编译:
$ gcc -static-libstdc++ main.c -o Server1 `mysql_config --cflags --libs` -lssl -lcrypto -lm -L /user-L/usr/lib/x86_64-linux-gnu
然后为了验证输出 id 是否是静态的,我运行以下命令:
$ ldd Server1
导致以下输出:
linux-vdso.so.1 => (0x00007ffce75e0000)
libmysqlclient.so.20 => /usr/lib/x86_64-linux-gnu/libmysqlclient.so.20 (0x00007fbd8662f000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fbd86412000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fbd86209000)
libssl.so.1.0.0 => /lib/x86_64-linux-gnu/libssl.so.1.0.0 (0x00007fbd85fa0000)
libcrypto.so.1.0.0 => /lib/x86_64-linux-gnu/libcrypto.so.1.0.0 (0x00007fbd85b45000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fbd8577b000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fbd85561000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fbd8535d000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fbd84fda000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fbd84cd1000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fbd84abb000)
/lib64/ld-linux-x86-64.so.2 (0x00005584efccf000)
$
那么为什么上面的库不包含在Server1二进制文件中呢?
种
要使用 gcc 编译独立程序,编译时需要使用 -static
标志。
例如:
gcc -static -o a.out main.c -lm
在您的情况下,您正在尝试将可执行文件链接到共享库。您将需要这些库的静态版本才能实现您的目标,否则ld
将失败。
相关文章:
- 正在读取二进制文件(is_open)
- 在C++中将类(带有Vector成员)保存为二进制文件
- 如何从二进制文件中读取字符串
- 保存/加载大量短数组到二进制文件
- 从二进制文件中读取整数数组
- Android 在编译二进制文件时重建静态库
- 无法将静态二进制文件链接到 #include
- 使用 openssl 构建静态二进制文件的正确方法是什么?
- 挂接静态链接的 ELF 二进制文件
- 使用不同.dll(导出相同的符号)静态链接的二进制文件
- 模板类静态在最终二进制文件中跨共享库以不同方式实例化是否一致
- 静态或动态链接到容器中运行的二进制文件的 C 运行时 (CRT)
- 使用静态依赖性为共享二进制文件编译语法需要更加清晰
- 如何在二进制文件中包含共享库依赖项(不使用.deb或.rpm)和/或针对PulseAudio的静态链接
- 用于静态分析本机Windows二进制文件大小的工具
- 将动态链接的elf二进制文件转换为静态链接的
- 静态链接到现有的windows二进制文件
- 获取静态二进制文件的AOSP回溯
- 如何将cpp源代码编译为完整的静态二进制文件,除了:libc、libpthread、libdl、libstdc++和li
- 为什么不能使用 GCC 生成静态二进制文件