2012-02-01 4 views
26

¿La opción "--address-model = 32,64" compilará bibliotecas de 32 y 64 o tiene que hacer dos compilaciones separadas?¿Construye bibliotecas de 32 y 64 bits para impulsar al mismo tiempo?

+1

** Para aquellos de ustedes compilando para i386 Mac OS ** y tropezaron aquí, y no funcionó, entonces estaban a punto de suicidarse (como yo), agreguen esta bandera también: 'architecture = x86' – Mazyod

+1

Tengo una pregunta similar. Puedo construir boost 32 y 64 bit (la sugerencia 32_64 en la respuesta a continuación NO funciona en Windows con la versión 1.57.0) y almacenarlos en diferentes directorios lib, pero al hacer referencia a esas librerías, ¿cuál es el mejor enfoque sugerido para organizar ¿ellos? Quiero poder construir proyectos de 32 bits y 64 sin tener que cambiar entre variables de entorno (por ejemplo, al usar cmake) – StarShine

Respuesta

18

Haciendo:

b2 address-model=32,64 

O ..

b2 address-model=32,64,32_64 

trabajo y produce, en función de conjunto de herramientas y soporte de la plataforma, tanto objetivos de 32 y 64 bits en el primer caso. Y 32, 64 y 32 + 64 objetivos universales (muy probablemente solo en OSX usando el conjunto de herramientas darwin. Y por "funciona" quiero decir que lo probé con mi biblioteca de Boost en OSX con el conjunto de herramientas darwin. Por lo tanto, sospecho que tiene la sintaxis incorrecta, es decir, no utiliza las "--name = valores" ya que no son opciones, pero en lugar de utilizar "name = valores" son los son especificaciones de requisitos

+2

¡Gracias por la aclaración de la sintaxis! Tal vez estoy siendo exigente, pero ¿no debería b2 estar dando un error (advertencia como mínimo) cuando la sintaxis es incorrecta? Supongo que la moraleja de la historia es tener cuidado con b2 !! – PopcornKing

+0

No es realmente fácil, a partir del punto de vista de la implementación de b2, que la sintaxis sea incorrecta. Ve una opción sintaxis correcta (cualquier cosa que comience con "-", que no reconoce, que se pasa a los Jamfiles. Todos observan la opción, de forma modular, y deciden que no la manejan. no hay lugar donde pueda decidir que la opción no es válida. Es decir, acaba siendo ignorado. Lo cual es un efecto de que la CLI b2 no sea un conjunto de sintaxis cerrado. – GrafikRobot

+18

Creo que tendrá un problema con esto cuando viene a sacar las bibliotecas porque desafortunadamente las bibliotecas de 32 bits y 64 bits tienen nombres idénticos. Necesita ejecutar b2 dos veces. Una vez con, por ejemplo, "--stagedir = etapa32 modelo de dirección = 32" y una vez con " --stagedir = stage64 address-model = 64 ". – mheyman

9

Los estados de documentación (énfasis mío):

"explícitamente Solicitar ya sea 32 bits o 64 bits generación de código."

Tenga en cuenta que no dice "uno o más de" o "al menos uno de", dice que ... o bien, lo que implica XOR en mi lectura y su experiencia coincide con eso.

La coma en la lista de valores permitidos consiste simplemente en separar los dos elementos en el conjunto de valores permitidos.

+0

La documentación también dice: "La coma tiene un significado especial solo si la característica tiene un conjunto de valores fijo, entonces bjam include = estático, compartido no se trata especialmente. " 32 y 64 me parecen correctos para el modelo de dirección. Gracias por responder. – PopcornKing

+1

@PopcornKing - Creo que el comentario "o bien ... o bien" en el indicador específico reemplaza cualquier comentario general que aplique – Flexo

6

que terminé haciendo lo siguiente:.

  • tienda el 32 lib/DLL se basa en una carpeta separada llamada/lib32
  • tienda el 64 lib/DLL se basa en una carpeta llamada seaprate/lib64

Ambos son preferiblemente en una ruta de búsqueda que aumentan ya está comprobando, como etapa o en la carpeta de instalación .

Luego añade este bloque justo después de las rutas de búsqueda se montan debajo de la cabecera (el archivo FindBoost.cmake editar está en la carpeta share/cmake-3.1/Módulos/ en la carpeta de instalación CMake)

empezar a encontrar a impulsar las bibliotecas


...

si (Boost_LIBRAR Y_DIR)

...

endif()

#generate 32 and 64 bit paths 
if(WIN32) 
    if(CMAKE_CL_64) 
     #message("Finding BOOST on windows platform (64 bit)") 
     SET(BOOST_libdir_suffix_gen "64") 
    else() 
     #message("Finding BOOST on windows platform (32 bit)") 
     SET(BOOST_libdir_suffix_gen "32") 
    endif() 

    list(APPEND _boost_LIBRARY_SEARCH_DIRS_PLATFORMS "") 
    foreach(SEARCH_DIR_NOPLATFORM ${_boost_LIBRARY_SEARCH_DIRS}) 
     list(APPEND _boost_LIBRARY_SEARCH_DIRS_PLATFORMS ${SEARCH_DIR_NOPLATFORM}${BOOST_libdir_suffix_gen})   
    endforeach() 
    foreach(SEARCH_DIR_PLATFORM ${_boost_LIBRARY_SEARCH_DIRS_PLATFORMS}) 
     list (APPEND _boost_LIBRARY_SEARCH_DIRS ${SEARCH_DIR_PLATFORM}) 
    endforeach() 
else() 
    # no generation required (?) 
endif() 

Se volverá a anexar todos los directorios lib existentes a la ruta de búsqueda de impulso para las bibliotecas, con el sufijo una etiqueta de extensión de 64 o 32 bits. Esto selecciona las librerías de destino correctas para vincular, y puede regenerar de forma segura cualquier otra biblioteca de cmake dependiente (como CGAL) para una compilación de destino de 32 o 64 sin restablecer la ruta de dependencia de impulso.

Cuestiones relacionadas