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