2015-12-03 38 views

回答

1

在什麼情況下我會鏈接一個應用程序與一羣文件的 ,但在運行時仍需要.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的提要VS的.so:

存檔庫(.a)中(在編譯時)靜態鏈接。生成的二進制文件包含您創建的程序和庫。

共享對象庫(.so)在運行時加載。由於它們並未實際添加到您正在創建的二進制文件中,因此它們的總體內存佔用率較低。

至於爲什麼一個可能選擇使用靜態庫,你必須看看靜態庫

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

的親來看看thisthis對共享對象庫VS靜態更多信息。