В GCC я могу использовать флаги компоновщика -Wl,--start-group
а также -Wl,--end-group
решить проблемы с библиотеками, имеющими циклические зависимости. Я хотел бы сделать то же самое с Clang, но кажется, что эта функция была упал в lld версии 3.2. Как мне это сделать?
заметки о выпуске LLVM 3.2 утверждают, что
llvm-ld и llvm-stub были удалены, функциональность llvm-ld может быть частично заменена на llvm-link | выбрать | {ооо | as, llc -filetype = obj} | или полностью заменен на Clang.
По умолчанию Clang использует системный компоновщик. То есть в Linux, например, он использует GNU ld:
$ clang --version
clang version 3.2 (branches/release_32 170558)
...
$ clang -Wl,--verbose
GNU ld (GNU Binutils; devel:gcc / openSUSE_12.3) 2.24.0.20140403-196
...
Это говорит о том, что вы можете использовать -Wl, — start-group и -Wl, — end-group, как с GCC.
Я не фанат круговых зависимостей 🙂 но Вот некоторые говорят, что обрабатывают эти случаи, связывая некоторые библиотеки дважды. Я не пробовал, но это может увеличить площадь вашего кода.
$(CC) -o myApp -lfoo -lbar -lfoo
Я не знаю, работает ли это с Clang, но это может стоить того.
Лучшим решением будет удаление циклических зависимостей, так как это создаст вам больше проблем в будущем.
У меня была похожая проблема при связывании с пользовательским компилятором clang с использованием проекта QT c ++.
Проблема оказалась в том, что QT использовал clang (компилятор c), а не clang ++ (компилятор c ++). Определив компилятор как clang ++ вместо clang в проекте QT (установка QMAKE_CXX = clang ++), проект успешно связался.
Насколько я понимаю, то же самое относится и к gcc и g ++.