链接反对.a,但仍然需要.a,所以?(C++,linux)
Linking against .a, but still need .so? (C++, linux)
在什么情况下,我会将应用程序链接到一堆.a文件,但在运行时仍然需要.so文件?
在什么情况下,我会将一个应用程序与一堆的.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.
有关共享对象库与静态对象库的更多信息,请参阅此和此。
相关文章:
- 在C++/Linux中设置单调时钟的一些技巧
- Linux的Cpp上的计时器
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 在Linux中哪里可以找到互斥、未来等的源代码
- 如何在linux终端中同时编译和运行c++代码
- 在Linux for Windows上编译C++代码时出错
- 如何找到锁定Linux futex的C++行
- 在linux上调试巨大的C++项目
- 如何处理linux终端中带有负号(-)的C++中的命令行参数
- c++方法参数只能在linux的发布模式下自行更改
- 在Linux和C++中的Windows上,散列字符串值会产生不同的输出
- 这里在 Linux 中具有"CreatePipe"和"CreateProcessW"功能吗?
- 函数在Windows或Linux上运行时表现不同
- 在Linux下捕获SIGKILL的C++程序
- 在为LINUX创建共享库时,如何避免STL的私有/弱副本
- 使用 cmake 的 Linux 终端上的"Conversion to non-scalar type is requested"错误
- 如何在CPP中创建应该在Windows和Linux上运行的套接字?
- mysql C++ connector [mysql-connector-c++-8.0.19-linux-glibc2
- 这些是什么样的错误?即使我不在 Linux 上工作,我也遇到了 Linux 错误
- 链接反对.a,但仍然需要.a,所以?(C++,linux)