2015-11-25 112 views
2

我一直試圖在我的mac上編譯一個開源的C++庫(QuantLib-1.7)幾天,但我似乎遇到了某種C++ 11的兼容性問題。使用C++編譯g ++的庫11

當我運行從編譯似乎除了一堆出錯的形式來工作的終端make && sudo make install

Making all in BermudanSwaption 
g++ -DHAVE_CONFIG_H -I. -I../../ql -I../.. -I../.. -I/opt/local/include -g -O2 -MT BermudanSwaption.o -MD -MP -MF .deps/BermudanSwaption.Tpo -c -o BermudanSwaption.o BermudanSwaption.cpp 
In file included from BermudanSwaption.cpp:22: 
In file included from ../../ql/quantlib.hpp:43: 
In file included from ../../ql/experimental/all.hpp:25: 
In file included from ../../ql/experimental/volatility/all.hpp:21: 
In file included from ../../ql/experimental/volatility/zabr.hpp:31: 
In file included from ../../ql/math/statistics/incrementalstatistics.hpp:35: 
In file included from /opt/local/include/boost/accumulators/statistics/stats.hpp:14: 
In file included from /opt/local/include/boost/accumulators/statistics_fwd.hpp:12: 
/opt/local/include/boost/mpl/print.hpp:50:19: warning: in-class initialization 
    of non-static data member is a C++11 extension [-Wc++11-extensions] 
const int m_x = 1/(sizeof(T) - sizeof(T)); 
      ^
1 warning generated. 

我猜這事做與G ++沒有被正確配置爲C + +11。我很熟悉C++ 11可以通過編譯g++ -std=c++11來調用。但是,儘管有大量的使用Google搜索,但我無法找到修改makefile的方法,因此在運行make && sudo make install時會調用-std=c++11

任何幫助將不勝感激。

這裏是生成文件的我相信部分是相關的:

BOOST_INCLUDE = -I/opt/local/include 
BOOST_LIB = -L/opt/local/lib 
BOOST_THREAD_LIB = 
BOOST_UNIT_TEST_DEFINE = -DQL_WORKING_BOOST_STREAMS 
BOOST_UNIT_TEST_LIB = boost_unit_test_framework-mt 
BOOST_UNIT_TEST_MAIN_CXXFLAGS = -DBOOST_TEST_DYN_LINK 
CC = gcc 
CCDEPMODE = depmode=gcc3 
CFLAGS = -g -O2 
CPP = gcc -E 
CPPFLAGS = -I/opt/local/include 
CXX = g++ 
CXXCPP = g++ -E 
CXXDEPMODE = depmode=gcc3 
CXXFLAGS = -g -O2 

以下是運行的 「g ++ -v」 輸出:

Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1 
Apple LLVM version 7.0.0 (clang-700.1.76) 
Target: x86_64-apple-darwin14.5.0 
Thread model: posix 

Makefile.am:https://www.dropbox.com/s/v5j7qohwfup81od/Makefile.am?dl=0

Makefile.in:https://www.dropbox.com/s/t92hft9ea2ar1zw/Makefile.in?dl=0

QuantLib-1。 7目錄:https://www.dropbox.com/sh/ulj0y68m8x35zg8/AAA-w7L2_YWIP8_KnwURErzYa?dl=0

完整的錯誤日誌:https://www.dropbox.com/s/g09lcnma8skipv7/errors.txt?dl=0

+1

爲什麼不'釀造安裝quantlib'? –

+0

好的,現在就開始拍攝吧。 – user11881

+0

'g ++ -I/opt/local/include/-I/opt/local/include/boost BermudanSwaption.cpp \ > -o bermudanswaption -L/opt/local/lib/-lQuantLib'後跟'。/ bermudanswaption'似乎現在成功運行。這一切似乎很混亂。有什麼地方可以閱讀關於quintib的頭文件和cpp文件是如何在文件系統中組織的?謝謝。 – user11881

回答

3

CXXFLAGS += -std=c++11 

添加東西到你Makefile。無論達爾文特定的可執行文件g++是否可用,這都可以工作 - 這真的是clang++

參考文獻:

+0

Hi rubicks。我實際上已經嘗試在無擴展名的makefile中添加'CXXFLAGS + = -std = C++ 11',這是行不通的。我嘗試將該行添加到Makefile.am,導致出現以下錯誤:'cd。 &&/bin/sh /Users/james/Dropbox/Finance/QuantLib-1.7/config/missing automake-1.14 --foreign Makefile /Users/james/Dropbox/Finance/QuantLib-1.7/config/missing:line 81:automake -1.14:未找到命令 警告:'automake-1.14'在您的系統上丟失。' – user11881

+0

@ user11881好的,這改變了一切。如果你有自動工具已經工作,不建議編輯任何生成的'Makefile'。相反,嘗試在你的'Makefile.am'中添加'AM_CXXFLAGS + = -std = C++ 11'到 – rubicks

+0

@ user11881,如果你錯過了它們,也可以獲取最新的stable autotools:'''''' – rubicks

0

正如你已經擁有的,所熟悉的homebrew,我的建議是用它來安裝和管理quantlib這樣的:

brew install quantlib 

然後,將建立並把所有的文件/usr/local/Cellar/quantlib在某些版本號並不重要。重要的是這些工具然後鏈接到/usr/local/bin,所以你所需要做的就是確保/usr/local/bin在你的PATH中。

這使您可以訪問工具quantlib-config,該工具始終鏈接到最新版本,並知道它是哪個版本。所以,如果你運行:

quantlib-config --cflags 

它會告訴你正確的路徑是什麼,你的includes這樣的:

-I/usr/local/Cellar/quantlib/1.6.1/include 

同樣的,如果你運行:

quantlib-config --libs 

它會告訴你正確的鏈接目錄和庫爲你的最新版本。

總之,所有你需要做的編譯是:

g++ $(quantlib-config --cflags --libs) 

,它會一直在你正在使用的版本拉。

請注意,如果您使用Makefile,則需要將美元符號加倍。

+0

嗨馬克。如果我沒有弄錯,你的答案是指使用從brew下載的預編譯的quantlib二進制包來編譯示例文件。實際上,我更感興趣的是爲開發目的編譯quantlib庫。 – user11881

0

這就是我最終設法編譯Quantlib庫以備將來參考。這可能不是最高效/優雅的方法,但它似乎工作。

  1. 我跟着http://quantlib.org/install/macosx.shtml給出的步驟,發現運行make && sudo make install導致了OP報告的錯誤。

  2. 在Eclipse中創建一個新的靜態庫的C++項目稱爲 'Quantlib'

  3. 複製位於.tar文件到Quantlib Eclipse工作區

  4. 右鍵單擊Quantlib的QL目錄>屬性> C++編譯器:將語言標準更改爲ISO C++ 11(-std = C++ 0x)

  5. 右鍵單擊Quantlib> C/C++常規>路徑和符號:添加以下內容包括GNU C++

    的目錄

    選擇/本地/包括

    /Quantlib(檢查 「是一個工作區目錄」)

    /選擇/本地/包括/升壓。

  6. 構建Quantlib項目(大約在MacBook Air上的1.8 GHz英特爾酷睿i7 34分鐘)

  7. 創建一個新的C++可執行項目(如BermudanSwaption)和BermudanSwaption.cpp複製到BermudanSwaption Eclipse工作區

  8. 重複步驟4和5。對於BermudanSwaption Eclipse項目

  9. 右鍵單擊BermudanSwaption>屬性> C/C++常規>路徑和符號>參考:檢查Quantlib(庫路徑選項卡現在應該包含條目 '/ Quantlib /調試')

  10. 構建和運行BermudanSwaption可執行項目


QuantLib-1.7

OSX Yosem伊特10.10.5

Eclipse的C/C++開發工具版本:8.8.0.201509131935

的Xcode 7.1版本(7B91b)

Xcode中,選擇版本2339

+0

附加說明:我發現爲Quantlib靜態項目選擇編譯器爲「Cross GCC」非常重要。如果我選擇「MacOSX GCC」,我發現每次嘗試編譯可執行項目時,整個庫都會重新編譯(我爲可執行項目選擇了「MacOSX GCC」) – user11881