链接.a,但仍需要.so? (C ++,linux)

时间:2015-12-03 22:47:54

标签: c++ linux linker runtime libraries

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

1 个答案:

答案 0 :(得分: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 vs .so的概要:

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

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

至于为什么人们可能会选择使用静态库,你必须看一下静态库专业人士

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

有关共享对象库与静态的详细信息,请参阅thisthis