2012-07-22 17 views
5

Estoy implementando en algunos códigos C++ que me gustaría hacer tan portátil como sea posible. Me gustaría evitar las dependencias en las bibliotecas que requieren acceso de root para instalar. Además, preferiría evitar tener copias de bibliotecas grandes en mi repositorio, y también preferiría no hacer instalaciones de bibliotecas a nivel de usuario (simplemente porque tendría que instalarlas manualmente en múltiples computadoras).Compilación con librerías Boost individuales, sin instalar Boost

Me gustaría usar la funcionalidad normal_distribution de Boost en mi proyecto. Entiendo que la forma típica de instalar Boost requiere un tipo de comando sudo apt-get o sudo yum, pero no tengo acceso de administrador en los sistemas donde se ejecutará este código. Para evitar esto, me pregunto si podría simplemente colocar una copia de Boost normal_distribution.cpp y normal_distribution.hpp en mi directorio de código y compilar/vincular mi código con estos archivos. ¿Esto funcionaría?

Los lectores pueden preguntarse por qué no estoy utilizando simplemente la implementación normal_distribution en TR1 o C++ 11. La respuesta es que necesito mantener la compatibilidad con algunos clústeres administrados por la universidad que aún ejecutan g ++ 4.1.x, que (al menos en mi experiencia) no es compatible con <TR1/random>.

+0

Nota al margen: El proyecto en el que estoy trabajando no es para nada rentable y no violaría ninguno de los términos de licencia de Boost. – solvingPuzzles

+2

boost tiene una utilidad para extraer las dependencias de cualquier encabezado. no es completamente 100%, pero el trabajo manual se reduce en gran medida. Echale un vistazo. –

+0

Gracias, Alf. Analicé el uso de BCP (http://www.boost.org/doc/libs/1_50_0/tools/bcp/doc/html/index.html) para extraer las dependencias; aún puedo usar esto. Sin embargo, al no estar seguro de cómo es la curva de aprendizaje para BCP, podría ver si aparece algo más fácil antes de probar BCP. – solvingPuzzles

Respuesta

3

Imagino que BCP (Boost Copy) se escribió precisamente teniendo en cuenta su situación.

+0

Bien, estoy intentando configurar BCP. Hice una 'subida de instalación brew' en una máquina Mac OS X. He leído que BCP es parte de la instalación de Boost. Sin embargo. Obtengo '-bash: bcp: command not found' cuando escribo' bcp' en la línea de comando. – solvingPuzzles

+0

También hice 'brew install boost-build', y todavía no tengo bcp. Cuando busco en google bcp, la mayoría de los lugares dicen que bcp es parte de la distribución boost. ¡Ayuda! – solvingPuzzles

+1

Tengo bcp instalado. Tuve que extraer el código fuente del sitio web de Boost y compilarlo/instalarlo. No fue tan tedioso como esperaba. :) – solvingPuzzles

2

Debe consultar el proyecto ryppl ya que esto es exactamente lo que espera lograr. Si sigue los enlaces a github, encontrará boost modularizado y desde allí podrá continuar y probar una instalación de ryppl completa. En cualquier caso, hay una casa de medio camino y eso es modularised boost. También hay un boost/cmake modularizado para hacerlo más simple. Esta es la dirección que ryppl busca impulsar y debería ser muy útil. El único inconveniente que puedo ver es la propensión a usar scripts de Python para el instalador de instalación cero.

Como se dijo BCP también fue desarrollado para este propósito, así que hay una opción. Tenga en cuenta que aunque el boost está pasando por un cambio svn-> git y esto parece estar afectando a alguna estructura que se refleja en algunas inconsistencias con el actual impulso modularizado, no estoy seguro de cómo/si eso afecta a BCP ya que no tengo conocimiento de eso sistema.

+0

Interesante. Podría extraer el boost/ryppl modularizado actual e instalarlo. :) – solvingPuzzles

0

Tuve algunos problemas para hacer que BCP funcione correctamente. Documenté el BCP-related question in this StackOverflow post.

A corto plazo, acabo de agregar una función normal_distribution a mi código base. Lo armé a partir de un par de publicaciones pasadas de StackOverflow. Esta implementación no hace ningún tipo de plantilla elegante, pero de lo contrario se ve bastante similar a las API Boost, TR1 y C++ 11 de 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; 
} 

Gracias a this StackOverflow post (usuario Pete855217) para la función sampleNormal(), y gracias a this StackOverflow post (user5084) para la función que he llamado normal_distribution().

Cuestiones relacionadas