В рамках исследовательского проекта я пытаюсь использовать clang 6.0.1 с Xcode 9.4.1.Я собрал и установил clang в произвольном месте (/ opt / llvm-6_0_1 / clang).Я написал простую спецификацию компилятора xcplugin для интеграции моей версии clang с Xcode.
Теперь я могу открывать проекты в Xcode, выбирать мой прокси-компилятор и использовать его для сборки вместо стандартного клана Apple.
Были некоторые незначительные дополнения, которые я должен был сделать в файле xcspec xcpluginчтобы заставить это работать, это, вероятно, не будет интересно большинству людей, поэтому я не буду приводить здесь подробности, если не будет спрошено.
Это все работает с большинством проектов, с которыми я играл, но яЯ сталкиваюсь с странной проблемой, когда моя копия clang не может найти неявно связанную статическую библиотеку.В частности, я получаю эту ошибку:
ld: file not found: /opt/llvm-6_0_1/clang/Toolchains/LLVM6.0.1.xctoolchain/usr/lib/arc/libarclite_macosx.a
clang-6.0: error: linker command failed with exit code 1 (use -v to see invocation)
Обратите внимание, что файл libarclite_macosx.a явно не включен в проект Xcode.Я подумал, что это должно быть неявно включено, возможно, потому что этот проект включает ARC?
После заливки через сгенерированную командную строку Xcode (это сложно), я решил взглянуть на файл MyProject__dependency_info.dat, который передается черезопция -dependency_info.По-видимому, этот файл данных (путь определяется как env var LD_DEPENDENCY_INFO_FILE) создается в процессе компоновки, а не как входная информация для компоновщика.Возможно, он существует из-за обходного пути, использующего символические ссылки, которые я использовал для получения ссылки на работу (описано в конце).
В любом случае формат представляется двоичным, но я смог увидеть текстссылка на libarclite_macosx.a в файле:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_macosx.a
После включения опции -Xlinker -v я мог видеть, что мой встроенный clang не выполняет поиск в пути по умолчанию в цепочке инструментов или путях дуг, поэтому я добавил их:
-L/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib
-L/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc
Теперь я могу видеть пути поиска в подробном выводе, но clang все еще не может найти библиотеку:
Library search paths:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc
Я попытался добавить пути к путям поиска в рамках.Я также попытался определить различные пути ссылки env.Ничего не помогло.
Чтобы попытаться понять, что на самом деле делает Clang, я использовал fs_usage при получении ошибки ссылки:
sudo fs_usage -e -w -f filesys | grep "lib/arc"
14:11:00.461965 stat64 [ 2] /opt/llvm-6_0_1/clang/Toolchains/LLVM6.0.1.xctoolchain/usr/lib/arc>>>>>>>>>>>>>>>>>>>>>> 0.000006 ld.1421614
14:11:00.461968 stat64 [ 2] /opt/llvm-6_0_1/clang/Toolchains/LLVM6.0.1.xctoolchain/usr/lib/arc>>>>>>>>>>>>>>>>>>>>>> 0.000002 ld.1421614
Очевидно, что Clang действительно хочет найти этот файлв установленном месте, а не в месте, указанном в -dependency_info, или в путях поиска, которые я предоставляю.
На этом этапе единственный способ заставить сборку работать - добавить символическую ссылку наКаталог "arc" XCode к моей установленной директории lib clang.Это «работает», но хрупко и противно.
Есть мысли о том, как я могу заставить Clang найти статическую библиотеку там, где она на самом деле живет?