Domanda

Sono in fase di porting di un large'ish (~ 1M LOC) progetto da un / ambiente Visual Studio Finestra ad altre piattaforme, il primo dei quali sembra essere Mac OS X.

In origine il progetto è stato configurato come soluzioni di Visual Studio e progetti, ma ora sto usando (il eccellente) Premake ( http :. //industriousone.com/premake ) per generare file di progetto per piattaforme multiple (VS, XCode, GAssicurarsi)

Ho configurato, porting e costruito i primi progetti senza problemi significativi, ma avendo porting lib matematica, mi sono imbattuto in questo errore di collegamento strano che io non sono stato in grado di risolvere: Tutte le funzioni utilizzate dalla matematica .h non riuscirà a creare un collegamento (causando simboli non risolti).

Per riferimento, sto usando Premake V4.2.1 per generare progetti per XCode V3.2.1, che sta costruendo con v4.2 gcc per l'architettura x86_64. (Tutto questo a 64 bit di Snow Leopard) ho cercato di convincere gcc per collegare e costruire tutto contro una 'nota' SDK con l'aggiunta di -isysroot /Developer/SDKs/MacOSX10.6.sdk -mmacosx-versione-min = 10.6 alla riga di comando di compilazione.

Ora in circostanze normali, l'aggiunta di -lm dovrebbe prendersi cura di questo, però a Darwin, queste librerie matematiche sono compresi nel libSystem, che, per quanto posso dire, viene implicitamente collegata da gcc / ld.

Ho cercato di creare un progetto fittizio all'interno di XCode che corre solo:

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

e come previsto, questo si basa più che bene. Tuttavia, se metto la stessa cosa nel codice all'interno del progetto generato Premake, tutte quelle funzioni matematiche finiscono irrisolto.

Ora confrontando il comando di collegamento dal progetto 'nativo' XCode con il mio progetto XCode generato, sembrano abbastanza identici (tranne che i miei generati link progetto altre librerie come bene).

progetto 'Native':

/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

progetto generato:

/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

Qualsiasi aiuto o suggerimenti su come procedere sarebbero apprezzate. Ci sono bandiere gcc o altri strumenti che possono aiutare a risolvere questo?

È stato utile?

Soluzione

sono finalmente riuscito a risolvere / lavoro-intorno a questo.

Con la sostituzione

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

con

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

link Tutto come previsto.

io accettare il fatto che la soluzione cmath è probabilmente il codice che ho dovuto scrivere in primo luogo, anche se mi piacerebbe accetto volentieri ulteriori opinioni sul perché il mio approccio C fallito così miseramente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top