2012-07-22 277 views
5

我正在實現一些我希望儘可能便攜的C++代碼。我想避免依賴於需要root訪問權限的庫來安裝。此外,我更願意避免飼養的大型圖書館拷貝在我的倉庫,我也寧願不要做圖書館的用戶級安裝(只是因爲我必須在多臺計算機手動安裝它們。)使用單獨的Boost庫進行編譯,無需安裝Boost

我想在我的項目中使用Boost的normal_distribution功能。我知道安裝Boost的典型方法需要使用sudo apt-getsudo yum類型的命令,但我沒有在運行此代碼的系統上具有root訪問權限。爲了解決這個問題,我想知道我是否可以簡單地將Boost的normal_distribution.cppnormal_distribution.hpp的副本放在我的代碼目錄中,並使用這些文件編譯/鏈接我的代碼。這會工作嗎?

讀者可能會問,爲什麼我不只是使用TR1的normal_distribution實現或C++ 11。答案是我需要保持與仍然運行g ++ 4.1.x的大學管理的羣集的兼容性,至少在我的經驗中不支持<TR1/random>

+0

附註:我正在進行的項目完全不是爲了盈利,也不會違反任何Boost的許可條款。 – solvingPuzzles 2012-07-22 00:47:22

+2

boost有一個實用程序來提取任何標題的依賴關係。這不完全是100%,但手動工作大大減少。一探究竟。 – 2012-07-22 00:48:35

+0

謝謝Alf。我着眼於使用BCP(http://www.boost.org/doc/libs/1_50_0/tools/bcp/doc/html/index.html)來提取依賴關係 - 我仍然可以使用它。不知道BCP的學習曲線是怎樣的,但我可能會看到在嘗試BCP之前是否有更容易的事情發生。 – solvingPuzzles 2012-07-22 01:03:15

回答

3

我想象BCP (Boost Copy)的設計充分考慮你的情況正是寫的。

+0

好的,我試圖建立BCP。我在Mac OS X機器上做了'brew install boost'。我讀過BCP是Boost安裝的一部分。然而。當我在命令行輸入'bcp'時,我得到'-bash:bcp:command not found'。 – solvingPuzzles 2012-07-22 02:45:11

+0

我也做過'brew install boost-build',我還沒有bcp。當我谷歌BCP,大多數地方說,BCP是增強分配的一部分。幫幫我! – solvingPuzzles 2012-07-22 04:34:35

+1

我得到了bcp安裝。我不得不從Boost網站提取源代碼並構建/安裝它。沒有我想象的那麼單調乏味。 :) – solvingPuzzles 2012-07-22 07:57:02

2

你應該看看ryppl項目,因爲這正是它希望達到。如果你按照github的鏈接,你會發現模塊化的提升,從那裏你可以繼續嘗試一個完整的ryppl安裝。在任何情況下,都有一個半路的房子,那就是modularised boost。還有一個模塊化的boost/cmake使其更簡單。這是ryppl正在尋求提升的方向,它應該非常有幫助。我能看到的唯一缺點是傾向於使用零安裝安裝程序的python腳本。

如前所述,BCP也是爲此目的而開發的,因此有一個選擇。請注意,雖然boost正在經歷svn-> git的變化,並且這似乎正在影響某些結構,這反映了與當前模塊化boost的不一致之處,但我不確定該如何影響BCP,因爲我不知道該結構系統。

+0

有趣。我可能會拉現有的模塊化升壓/ ryppl並安裝它。 :) – solvingPuzzles 2012-07-22 23:02:40

0

我在使BCP正常工作時遇到了一些麻煩。我記錄了BCP-related question in this StackOverflow post

在短期內,我只是增加了一個normal_distribution功能,我的代碼庫。我把它從幾個StackOverflow帖子放在一起。這個實現不會做任何花哨的模板,但它看起來與normal_distribution的Boost,TR1和C++ 11 API非常相似。

#include "math.h" 
double normal_distribution(double mean, double stdDev) 
{ 
    //scale the number to appropriate distribution 
    return mean + (sampleNormal()*stdDev); 
} 

//get a number from normal distribution (mean=0, stdDev=1). 
double sampleNormal() { 
    double u = ((double) rand()/(RAND_MAX)) * 2 - 1; 
    double v = ((double) rand()/(RAND_MAX)) * 2 - 1; 
    double r = u * u + v * v; 
    if (r == 0 || r > 1) return sampleNormal(); //recursively re-generate number if doesn't meet criteria 
    double c = sqrt(-2 * log(r)/r); 
    return u * c; 
} 

感謝this StackOverflow post(用戶Pete855217)爲sampleNormal()功能,並感謝this StackOverflow post(user5084)爲我命名normal_distribution()功能。