Созданный вручную clang не может найти неявно связанную статическую библиотеку в инструментальной цепочке Xcode по умолчанию - PullRequest
0 голосов
/ 25 января 2019

В рамках исследовательского проекта я пытаюсь использовать 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 найти статическую библиотеку там, где она на самом деле живет?

...