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