Этот вопрос был первым в моем поиске «циклической зависимости dll», и даже если ему 10 лет, это позор, что большинство ответов указывают на «рефакторинг», который является очень и очень глупым советом для крупного проекта и все равно не было вопроса.
Итак, я должен указать, что циклическая зависимость не так опасна. Они совершенно нормально работают в Unix / Linux. Они упоминаются во многих статьях MSDN как возможные ситуации с способами их обойти . Это происходит в JAVA (компилятор решает это путем muilti-pass компиляции). Сказать, что рефакторинг - единственный способ, это все равно, что запретить «друзей» на занятиях.
- этот параграф в руководстве для начинающих по линкерам (Дэвид Драйсдейл) хорошо объясняет это для VS-линкеров.
Так что хитрость заключается в том, чтобы использовать двухпроходную компиляцию: первая, которая создаст просто 'import-libs', и вторая, которая сама сгенерирует dll.
Для визуальной студии и любой графической компиляции это, вероятно, все еще что-то странное. Но если вы создаете свои собственные файлы Makefile и имеете лучший контроль над процессом компоновки и флагами, то это не так сложно сделать.
Используя OP-файлы экспертизы и синтаксис mingw-gcc в качестве концепции для демонстрации (поскольку я протестировал его и точно знаю, что он работает нормально в Windows), необходимо:
- скомпилировать / связать a.lib и b.lib без указания циклических библиотек:
g++ -shared -Wl,--out-implib=a.lib -o a.dll a.obj //without specifying b.lib
g++ -shared -Wl,--out-implib=b.lib -o b.dll b.obj //without specifying a.lib
... покажет «неопределенные ошибки ссылки» и не предоставит dll-s, но создаст a.lib
и b.lib
, которые мы хотим для связывания второго прохода:
g++ -shared -Wl,--out-implib=a.lib -o a.dll a.obj b.lib
g++ -shared -Wl,--out-implib=b.lib -o b.dll b.obj a.lib
и результат a.dll
и b.dll
с довольно чистым методом. Использование компиляторов Microsoft должно быть простым, с их советом переключить link.exe на lib.exe (не проверял его, кажется, даже чище, но, вероятно, сложнее сделать что-то продуктивное по сравнению с mingw + make tools).