Pregunta

Estoy en el proceso de portar un proyecto grande (~ 1M Loc) desde un entorno de ventana/Visual Studio a otras plataformas, la primera de las cuales es Mac OS X.

Originalmente, el proyecto se configuró como soluciones y proyectos de Visual Studio, pero ahora estoy usando (el excelente) Premgo (http://industriousone.com/premake) para generar archivos de proyecto para múltiples plataformas (vs, xcode, gmake).

Configuré, porté y construí los primeros proyectos sin problemas significativos, pero después de haber portado la Lib de matemáticas, me encontré con este extraño error de enlace que no he podido resolver: Cualquier función utilizada de Math.h no se unirá (causando símbolos no resueltos).

Como referencia, estoy usando Premake v4.2.1 para generar proyectos para Xcode v3.2.1, que se está construyendo usando GCC V4.2 para la arquitectura x86_64. (Todo esto en el leopardo de nieve de 64 bits) He tratado de persuadir a GCC para que vincule y construya todo contra un 'SDK' conocido agregando -isysroot /developer/sdks/macosx10.6.sdk -mmacosx-version-min = 10.6 a la línea de comando de compilación.

Ahora, en circunstancias normales, agregar -lm debería encargarse de esto, sin embargo, en Darwin, esas libres matemáticas se incluyen en Libsystem, que, por lo que puedo decir, se vincula implícitamente por GCC/LD.

He intentado crear un proyecto ficticio desde xcode que solo se ejecuta:

float f = log2(2.0)+log2f(3.f)+log1p(1.1)+log1pf(1.2f)+sin(8.0);
std::cout << f << std::endl;

Y como se esperaba, esto se desarrolla bien. Sin embargo, si pongo lo mismo en el código dentro del proyecto generado por el Premgo, todas esas funciones matemáticas terminan sin resolver.

Ahora comparando el comando de enlace del proyecto Xcode 'nativo' con mi proyecto Xcode generado, parecen bastante idénticos (excepto que mi proyecto generado también vincula otras libs).

Proyecto 'nativo':

/Developer/usr/bin/g++-4.2 -arch x86_64 -dynamiclib -isysroot /Developer/SDKs/MacOSX10.6.sdk -Lsomepath -Fsomepath -filelist somefile -install_name somename -mmacosx-version-min=10.6 -single_module -compatibility_version 1 -current_version 1 -o somename

Proyecto generado:

/Developer/usr/bin/g++-4.2 -arch x86_64 -dynamiclib -Lsomepath -Fsomepath -filelist somefile -install_name somename -isysroot /Developer/SDKs/MacOSX10.6.sdk -mmacosx-version-min=10.6 somelib.a somelib2.a somelib.dylib somelib2.dylib -single_module -compatibility_version 1 -current_version 1 -o somename

Cualquier ayuda o sugerencia sobre cómo proceder sería más apreciada. ¿Hay alguna bandera GCC u otras herramientas que puedan ayudarme a resolver esto?

¿Fue útil?

Solución

Finalmente logré resolverlo/solucionar esto.

Por reemplazo

#include <math.h>
float f = sinf(1.f);

con

#include <cmath>
float f = std::sin(1.f);

Todo se vincula como se esperaba.

Aceptaré el hecho de que la solución CMATH es probablemente el código que debería haber escrito en primer lugar, aunque felizmente aceptaría opiniones adicionales sobre por qué mi enfoque C falló tan miserablemente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top