Неразрешенные символы OSX / Дарвина при связывании функций из <math.h> - PullRequest
3 голосов
/ 11 марта 2010

Я в процессе переноса крупного (~ 1M LOC) проекта из среды Window / Visual Studio на другие платформы, первой из которых является Mac OS X.

Первоначально проект был сконфигурирован как решения и проекты Visual Studio, но теперь я использую (превосходный) Premake (http://industriousone.com/premake) для создания файлов проекта для нескольких платформ (VS, XCode, GMake).

Я сконфигурировал, портировал и собрал первые несколько проектов без каких-либо значительных проблем, но портировав библиотеку math, я столкнулся со странной ошибкой компоновки, которую мне не удалось устранить: Любые функции, используемые из математики .h не сможет установить связь (вызывая неразрешенные символы).

Для справки, я использую Premake v4.2.1 для генерации проектов для XCode v3.2.1, который строит с использованием gcc v4.2 для архитектуры x86_64. (Все это на 64-битном Snow Leopard) Я попытался убедить gcc связать и собрать все из «известного» SDK, добавив -isysroot /Developer/SDKs/MacOSX10.6.sdk -mmacosx-version-min = 10,6 в командной строке сборки.

Теперь при нормальных обстоятельствах добавление -lm должно позаботиться об этом, однако в Дарвине эти математические библиотеки включены в libSystem, которая, насколько я могу судить, неявно связана с gcc / ld.

Я пытался создать фиктивный проект из XCode, который просто запускается:

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

и, как и ожидалось, это просто отлично. Однако, если я добавлю то же самое в код внутри проекта, сгенерированного Premake, все эти математические функции останутся неразрешенными.

Теперь, сравнивая команду связывания из «родного» проекта XCode с моим сгенерированным проектом XCode, они кажутся довольно идентичными (за исключением того, что мой сгенерированный проект также связывает другие библиотеки).

'Родной' проект:

/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

Сгенерированный проект:

/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

Любая помощь или советы о том, как поступить, будут наиболее цениться. Существуют ли какие-либо флаги gcc или другие инструменты, которые могут помочь мне решить эту проблему?

1 Ответ

0 голосов
/ 11 марта 2010

Мне наконец удалось решить / обойти это.

Заменив

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

с

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

все ссылки, как и ожидалось.

Я приму тот факт, что cmath-решение - это, вероятно, код, который я должен был написать в первую очередь, хотя я с радостью согласился бы с другими мнениями о том, почему мой подход к Си так неудачен.

...