【发布时间】:2016-03-08 18:12:55
【问题描述】:
在什么情况下我会将应用程序链接到一堆 .a 文件,但在运行时仍需要 .so 文件?
【问题讨论】:
-
您是否使用了链接器标志
-static?
标签: c++ linux linker runtime libraries
在什么情况下我会将应用程序链接到一堆 .a 文件,但在运行时仍需要 .so 文件?
【问题讨论】:
-static?
标签: c++ linux linker runtime libraries
在什么情况下我会将应用程序链接到一堆 .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.
【讨论】: