1

我對鏈接庫有一些問題。靜態和動態鏈接庫

連接器如果決定,如果我想鏈接的庫鏈接靜態或動態?是否由文件擴展(.a/ .so)決定?

是否有可能動態鏈接.a庫?

是否有可能將.a庫轉換爲.so庫而不需要源代碼?

+3

是的,不,不。您通常需要編譯代碼*獨立位置*以使其可用作共享庫;除非明確要求,否則通常不會這樣做。 –

+0

@KerrekSB這難道不是答案嗎? – delnan

回答

1
  1. 鏈接器通過查看擴展名來決定如何鏈接庫,但這很大程度上取決於鏈接器。 AIX鏈接器有一些相當奇特的行爲。此外,如果同一位置同時存在.so和.so兩個版本的庫,則命令行開關會讓您確定使用哪個鏈接器。
  2. 排序。您可以將.a鏈接到.so,但會有性能問題 - 共享庫應該使用與位置無關的代碼來構建,以獲得最佳性能。根據代碼,鏈接器可能會拒絕鏈接它,因爲它無法修補重定位信息。但是你不能告訴鏈接器把.a當作一個.so
  3. 如上 - 也許。
0

默認情況下,如果在其搜索路徑中找到兩種類型的庫,gcc鏈接程序將動態鏈接到.so文件。你可以用命令行參數來覆蓋它,如here所述。