看板 Programming 關於我們 聯絡資訊
gcc 在編譯時提供了 -Wl,--as-needed 和 -Wl,--no-as-needed 兩個選項, 這兩個選項前者是開啟特性,後者是取消特性。 在生成可執行文件的時候,通過 -lxxx 選項指定需要鏈接的庫文件。以動態庫為例,如 果我們指定了一個需要鏈接的庫,則連接器會在可執行文件的文件頭中會記錄下該庫的 信息。而後,在可執行文件運行的時候,動態加載器會讀取文件頭信息,並加載所有的 鏈接庫。在這個過程中,如果用戶指定鏈接了一個毫不相關的庫,則這個庫在最終的 可執行程序運行時也會被加載,如果類似這樣的不相關庫很多,會明顯拖慢程序啟動 過程。 這時,通過指定 -Wl,--as-needed 選項,鏈接過程中,鏈接只會檢查所有的依賴庫,沒 有實際被引用的庫,不再寫入可執行文件頭。最終生成的可執行文件頭中包含的都是必要 的鏈接庫信息。 //main.cpp #include <iostream> int main() { std::cout << "Hello, World" << std::endl; } > g++ -Wl,--as-needed -lpthread -o main main.cpp 查看可執行文件 main 的文件頭中是否包含 pthread 庫: ldd main linux-vdso.so.1 (0x00007ffce44b7000) libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fd84013f000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd83ff7e000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fd83fdfb000) /lib64/ld-linux-x86-64.so.2 (0x00007fd8402e5000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fd83fde1000) 可見即使在命令行中指定了 -lpthread,一旦指定了 -Wl,--as-needed 選項,由於 pthread 庫不是必須的,所以不會在可執行文件中記錄 libphread (以上 from Ruo_Xiao) -Wl,--as-needed 刪除的是沒用到的依賴庫 不是Api function -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 218.187.81.159 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Programming/M.1684595315.A.6B7.html ※ 編輯: feelthat (114.32.93.159 臺灣), 05/30/2023 14:12:34