2012-03-14 81 views
2

我正在製作一個基本的角色扮演遊戲。我想靜態地包含Boost庫,以便運行我的遊戲的人不需要擁有它們。我研究和查找的,所有你需要做的就是添加-static到命令行編譯,所以我的命令是這樣的:與Boost和ncurses的靜態鏈接

$ g++ -static -o karthas *.o -lncurses -lmenu -lboost_system -lboost_filesystem 

但顯然-static是影響ncurses的。我遇到了一大堆錯誤,其中大部分都是對'SP'的未定義引用。

是否有可能只是做一個靜態鏈接到Boost而不是ncurses?我會怎麼做呢?

+0

通常的動態鏈接工作嗎?你是否可以在沒有靜態鏈接的情況下構建和運行你的程序? – chrisaycock 2012-03-14 18:49:43

+0

@chrisaycock是的,我的系統上有動態鏈接,因爲它安裝了bost庫。但我想要發生的是我能夠分發我的程序,而不需要用戶安裝boost庫。 – adamk33n3r 2012-03-14 20:12:02

回答

4

您可以選擇靜態鏈接哪些庫,並通過在名稱前放置-Wl,-static-Wl,-Bdynamic來動態鏈接哪些庫。

例如,具有:

g++ -o karthas *.o -Wl,-static -lmenu -lboost_system -lboost_filesystem -Wl,-Bdynamic -lncurses 

菜單,boost_system和boost_filesystem庫將被靜態和ncurses的鏈接的動態。

(但你也可以用你的可執行文件分發boost dll,而不是靜態鏈接任何東西)。

+0

這是完美的!謝謝。還有更多的東西。現在,當我運行可執行文件時,它說載入共享庫時出錯:libtinfo.so.5。那是什麼?我可以靜態鏈接? 關於你最後的聲明,我將如何分發他們與我的可執行文件?以及如何編譯它不同?此外,我在Linux上,所以他們沒有DLL的 – adamk33n3r 2012-03-14 20:09:50

+0

我認爲libtinfo.so.5是從ncurses。所以我知道這個帖子不是相關的,但我能夠靜態鏈接ncurses呢?我沒有意識到ncurses是一個動態鏈接庫 – adamk33n3r 2012-03-14 20:15:45

+0

我發現,我可以添加-DNCURSES_STATIC到.o創建,使靜態ncurses成爲可能。但後來我得到一個無法找到-lgcc_s錯誤。我想看看更多 – adamk33n3r 2012-03-14 20:27:59

0

但看着this,看起來你並不孤單,或者我發現你的問題。但this,可能有你的解決方案,無論哪種方式,祝你好運。 順便說一句,一些boost庫只不過是包含在文件中時導入的內聯函數。

+0

不是全部。其中一些,如文件系統,是編譯的二進制文件。 – adamk33n3r 2012-03-14 18:47:55

+0

取決於圖書館。一些boost庫有編譯組件(正則表達式,測試等) – 2012-03-14 18:48:04

+0

@JamesMichaelHare對。你碰巧知道如何解決我的問題? – adamk33n3r 2012-03-14 18:49:47