1
在什麼情況下我會將一個應用程序與一堆.a文件鏈接起來,但在運行時仍需要.so文件?與.a鏈接,但仍然需要.so? (C++,linux)
在什麼情況下我會將一個應用程序與一堆.a文件鏈接起來,但在運行時仍需要.so文件?與.a鏈接,但仍然需要.so? (C++,linux)
在什麼情況下我會鏈接一個應用程序與一羣文件的 ,但在運行時仍需要.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.
你使用了鏈接器標誌'-static'嗎? – SHR