c++ - 链接到 .a,但仍然需要 .so? (C++, Linux)

标签 c++ linux linker runtime libraries

在什么情况下我会将应用程序链接到一堆 .a 文件,但在运行时仍然需要 .so 文件?

最佳答案

Under what circumstances would I link an application against a bunch of .a files, but still require .so files at runtime?

运行时需要加载特定.so的情况

例如,您可能有两个共享对象库(.so):

RealCarLibrary
TestCarLibrary

但是您需要在运行时加载 Test 库或 Real 库,具体取决于用户环境变量 $CAR_LIB 的设置。

typedef int (*runCar_ptr)();
const char* env_variable = std::getenv("CAR_LIB");
void *sharedObject_ptr = nullptr;
if(env_variable == "test" )
{
   sharedObject_ptr =dlopen("/path/to/TestCarLibrary.so", RTLD_NOW);
}
else
{
  sharedObject_ptr = dlopen("/path/to/RealCarLibrary.so", RTLD_NOW);
}
runCar_ptr *runCarFunctionPtr = dlsym(sharedObject_ptr, "RunTheCar");
runCarFunctionPtr();

.a 与 .so 的对比:

存档库 (.a) 是静态链接的(在编译时)。生成的二进制文件包含您创建的程序和库。

共享对象库 (.so) 在运行时加载。它们会产生较低的整体内存占用量,因为它们实际上并未添加到您正在创建的二进制文件中。

至于为什么会选择使用静态库,就得看静态库的优点了

保证(在构建时)应用程序的库存在并且它们是正确的版本。

参见 thisthis有关共享对象库与静态库的更多信息。

关于c++ - 链接到 .a,但仍然需要 .so? (C++, Linux),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34077719/

相关文章:

c++ - "std_lib_facilities.h"显示错误

c++ - 动态规划 MPILOT

c++ - 在不实例化的情况下计算结构成员的偏移量

linux - 使用 sed 从文件 linux 替换单词

c++ - 尝试针对旧的 STD 库和 Windows SDK 进行编译时出现链接错误

c++ - 一个类的方法作为另一个类的回调

linux - 如何只获取程序的版本号?管道进入grep

linux - 将SIGINT从键盘发送到bash中的管道命令

linker - 在 Linux 上使用 GNU makefile 链接 protobuf 库

ios - 为什么我不能摆脱 libstdc++?