是否可以使用g ++編譯程序,以便共享庫等等被包含在可執行文件中?用C++編譯並準備好可執行文件
我有一個C++程序,我想編譯和運行在另一個地方,我錯過了一些庫,沒有安裝訪問權限。
主要的原因,我無法找到答案,這可能是我不知道怎麼叫吧..
是否可以使用g ++編譯程序,以便共享庫等等被包含在可執行文件中?用C++編譯並準備好可執行文件
我有一個C++程序,我想編譯和運行在另一個地方,我錯過了一些庫,沒有安裝訪問權限。
主要的原因,我無法找到答案,這可能是我不知道怎麼叫吧..
不,這是不可能的。
靜態鏈接(與-static
),因此它不使用任何共享庫,或將共享庫與可執行文件一起復制到其他位置。
由於共享庫不在動態加載程序的通常搜索路徑中,因此您需要確保可以找到它們,方法是在運行程序時設置LD_LIBRARY_PATH
環境變量,或者在可執行文件中設置RPATH時你建立它。 (假設您正在使用GNU鏈接器...)要在'-Wl,-rpath,$ORIGIN'
(引號很重要,要阻止$ORIGIN
被shell展開)的可執行文件鏈接中設置RPATH,請執行以下操作:這意味着加載器將在與可執行文件本身相同的目錄中查找共享庫。
查看https://gcc.gnu.org/onlinedocs/libstdc++/faq.html#faq.how_to_set_paths和https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dynamic_or_shared.html#manual.intro.using.linkage.dynamic瞭解更多信息。
@jorgen當遵循Jonathans的建議並在與應用程序相同的目錄中安裝共享庫時,可以使用'$ LD_LIBRARY_PATH =。; $ {LD_LIBRARY_PATH} ./
我想你需要使用庫的靜態版本來編譯(和鏈接)。如果您只有動態庫,則必須嘗試將它們重新編譯爲靜態庫。 – MiMo