Неразрешенные символы OSX / Darwin при связывании функций из ‹math.h›

Я сейчас портирую большой (~ 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 или другие инструменты, которые могут помочь мне решить эту проблему?


person tbone    schedule 11.03.2010    source источник


Ответы (1)


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

Заменив

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

с участием

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

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

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

person tbone    schedule 11.03.2010