构建可在 libc >= 2.31 的系统上运行的 Linux c++ 应用程序
Build a Linux c++ application runnable on system having libc >= 2.31
我想构建一个 C++ 应用程序,它可以在所有具有 libc >= 2.31 的 Linux 系统上启动。在我的构建系统 (Ubuntu) 上,我有 libc 2.34。
这是我的(空)申请:
int main() {
return 0;
}
我用 g++ -o app app.cpp
构建了它,根据以下结果,我了解到我的应用程序需要 libc >= 2.34 到 运行。我的理解正确吗?
$ nm -D app
w __cxa_finalize@GLIBC_2.2.5
w __gmon_start__
w _ITM_deregisterTMCloneTable
w _ITM_registerTMCloneTable
U __libc_start_main@GLIBC_2.34
如何为 libc <= 2.31 构建我的应用程序?我试图在我的主要方法之前添加“__asm__ (".symver __libc_start_main, __libc_start_main@GLIBC_2.2.5");
”(基于我对 this post 的理解),但它没有改变任何东西。
Docker 图像 ubuntu:20.04 已安装 libc 2:31。您可以在那里编译您的应用程序:
$ docker run --rm -v $PWD:/work -w /work ubuntu:20.04 bash -c 'apt-get update && apt-get -y install g++ && g++ -o app app.cpp'
$ docker run --rm -v $PWD:/work -w /work ubuntu:20.04 ./app
$ ./app
$ nm -D app
w _ITM_deregisterTMCloneTable
w _ITM_registerTMCloneTable
w __cxa_finalize@GLIBC_2.2.5
w __gmon_start__
U __libc_start_main@GLIBC_2.2.5
您可以link您的应用程序静态,删除对标准库的所有依赖。
您可以将您的应用程序与 libc 库一起分发。
我想构建一个 C++ 应用程序,它可以在所有具有 libc >= 2.31 的 Linux 系统上启动。在我的构建系统 (Ubuntu) 上,我有 libc 2.34。 这是我的(空)申请:
int main() {
return 0;
}
我用 g++ -o app app.cpp
构建了它,根据以下结果,我了解到我的应用程序需要 libc >= 2.34 到 运行。我的理解正确吗?
$ nm -D app
w __cxa_finalize@GLIBC_2.2.5
w __gmon_start__
w _ITM_deregisterTMCloneTable
w _ITM_registerTMCloneTable
U __libc_start_main@GLIBC_2.34
如何为 libc <= 2.31 构建我的应用程序?我试图在我的主要方法之前添加“__asm__ (".symver __libc_start_main, __libc_start_main@GLIBC_2.2.5");
”(基于我对 this post 的理解),但它没有改变任何东西。
Docker 图像 ubuntu:20.04 已安装 libc 2:31。您可以在那里编译您的应用程序:
$ docker run --rm -v $PWD:/work -w /work ubuntu:20.04 bash -c 'apt-get update && apt-get -y install g++ && g++ -o app app.cpp'
$ docker run --rm -v $PWD:/work -w /work ubuntu:20.04 ./app
$ ./app
$ nm -D app
w _ITM_deregisterTMCloneTable
w _ITM_registerTMCloneTable
w __cxa_finalize@GLIBC_2.2.5
w __gmon_start__
U __libc_start_main@GLIBC_2.2.5
您可以link您的应用程序静态,删除对标准库的所有依赖。
您可以将您的应用程序与 libc 库一起分发。