2012-07-22 40 views
5

Tôi đang triển khai trên một số mã C++ mà tôi muốn tạo càng dễ dàng càng tốt. Tôi muốn tránh các phụ thuộc trên các thư viện yêu cầu quyền truy cập gốc để cài đặt. Hơn nữa, tôi muốn tránh giữ bản sao của các thư viện lớn trong kho lưu trữ của mình và tôi cũng không thích cài đặt các thư viện cấp người dùng (đơn giản là vì tôi phải cài đặt chúng theo cách thủ công trên nhiều máy tính.)Biên dịch với các thư viện Boost cá nhân, Không cần cài đặt Boost

Tôi muốn sử dụng chức năng normal_distribution từ Tăng cường trong dự án của tôi. Tôi hiểu rằng cách điển hình để cài đặt Boost yêu cầu loại lệnh sudo apt-get hoặc sudo yum nhưng tôi không có quyền truy cập root trên các hệ thống mà mã này sẽ chạy. Để giải quyết vấn đề này, tôi tự hỏi liệu tôi có thể đặt một bản sao của Boost's normal_distribution.cppnormal_distribution.hpp vào thư mục mã của tôi và biên dịch/liên kết mã của tôi với những tệp này hay không. Điều này có hiệu quả không?

Người đọc có thể thắc mắc tại sao tôi không chỉ sử dụng triển khai normal_distribution trong TR1 hoặc C++ 11. Câu trả lời là tôi cần duy trì khả năng tương thích với một số cụm được quản lý bởi trường đại học mà vẫn chạy g ++ 4.1.x, mà (ít nhất là theo kinh nghiệm của tôi) không hỗ trợ <TR1/random>.

+0

Lưu ý phụ: Dự án tôi đang thực hiện không có lợi nhuận và sẽ không vi phạm bất kỳ điều khoản cấp phép nào của Boost. – solvingPuzzles

+2

boost có một tiện ích để trích xuất các phụ thuộc cho bất kỳ tiêu đề nào. nó không hoàn toàn 100%, nhưng công việc thủ công được giảm đáng kể. kiểm tra xem nó ra. –

+0

Cảm ơn, Alf. Tôi đã xem xét việc sử dụng BCP (http://www.boost.org/doc/libs/1_50_0/tools/bcp/doc/html/index.html) để trích xuất các phụ thuộc - tôi vẫn có thể sử dụng nó. Tuy nhiên, không chắc chắn về đường cong học tập như thế nào đối với BCP, tôi có thể thấy có bất kỳ điều gì dễ dàng hơn trước khi thử BCP hay không. – solvingPuzzles

Trả lời

3

Tôi tưởng tượng rằng BCP (Boost Copy) được viết chính xác với tình huống của bạn.

+0

Được rồi, tôi đang cố gắng thiết lập BCP. Tôi đã làm một 'brew install boost' trên một máy Mac OS X. Tôi đã đọc BCP đó là một phần của cài đặt Boost. Tuy nhiên. Tôi nhận được '-bash: bcp: lệnh không tìm thấy' khi tôi gõ' bcp' trên dòng lệnh. – solvingPuzzles

+0

Tôi cũng đã làm 'brew install boost-build', và tôi vẫn không có bcp. Khi tôi google bcp, hầu hết mọi nơi nói rằng bcp là một phần của phân phối tăng. Cứu giúp! – solvingPuzzles

+1

Tôi đã cài đặt bcp. Tôi đã phải lấy mã nguồn từ trang web Boost và xây dựng/cài đặt nó. Không phải là tẻ nhạt như tôi mong đợi. :) – solvingPuzzles

2

Bạn nên xem dự án ryppl vì đây chính xác là điều mà hy vọng đạt được. Nếu bạn làm theo các liên kết để github bạn sẽ tìm thấy tăng cường modularised và từ đó bạn có thể đi vào và thử một cài đặt ryppl đầy đủ. Trong mọi trường hợp, có một nhà nửa đường và đó là modularised boost. Ngoài ra còn có một boost/cmake mô-đun hóa để làm cho nó đơn giản hơn. Đây là hướng ryppl đang tìm cách tăng cường và nó sẽ rất hữu ích. Nhược điểm duy nhất tôi có thể thấy là xu hướng sử dụng các kịch bản python cho trình cài đặt không cài đặt.

Như đã nêu BCP đã được phát triển cho mục đích này cũng như vậy là có một sự lựa chọn. Tuy nhiên, điều này có vẻ đang ảnh hưởng đến một số cấu trúc được phản ánh trong một số mâu thuẫn với việc tăng cường mô đun hiện tại, tôi không chắc làm thế nào/nếu điều đó ảnh hưởng đến BCP như tôi không biết hệ thống.

+0

Thú vị. Tôi có thể kéo boost/ryppl mô đun hóa hiện tại và cài đặt nó. :) – solvingPuzzles

0

Tôi gặp sự cố khi BCP hoạt động bình thường. Tôi đã ghi lại số BCP-related question in this StackOverflow post.

Trong thời gian ngắn, tôi chỉ thêm một hàm normal_distribution vào cơ sở mã của tôi. Tôi đặt nó với nhau từ một vài bài viết StackOverflow trong quá khứ. Việc triển khai này không thực hiện bất kỳ công cụ mẫu ưa thích nào, nhưng nếu không nó trông khá giống với các API Boost, TR1 và C++ 11 của normal_distribution.

#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; 
} 

Nhờ this StackOverflow post (user Pete855217) cho sampleNormal() chức năng, và nhờ this StackOverflow post (user5084) cho các chức năng mà tôi đã đặt tên normal_distribution().

Các vấn đề liên quan