【问题标题】:Linking against .a, but still need .so? (C++, linux)链接到 .a,但仍需要 .so? (C++,Linux)
【发布时间】:2016-03-08 18:12:55
【问题描述】:

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

【问题讨论】:

  • 您是否使用了链接器标志-static

标签: c++ linux linker runtime libraries


【解决方案1】:

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

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

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

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) 在运行时加载。它们会导致较低的总体内存占用,因为它们实际上并未添加到您正在创建的二进制文件中。

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

To guarantee(at build time) that an application's libraries are present and that they are the correct version.

请参阅thisthis,了解有关共享对象库与静态的更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-27
    • 2021-01-31
    • 1970-01-01
    • 2011-12-17
    相关资源
    最近更新 更多