У меня есть программа на С++, которую я компилирую с помощью mingw (gcc для Windows). Использование выпуска TDM mingw, который включает gcc 4.4.1. Исполняемые ссылки на два файла статической библиотеки (.a): On из них - сторонняя библиотека, написанная на C; другая - библиотека С++, написанная мной, которая использует библиотеку C, предоставляет мой собственный С++ API сверху.
Функция (на мой взгляд, чрезмерная) функциональности библиотеки C реализована в встроенных функциях. Вы не можете избежать включения встроенных функций при использовании API-библиотеки C, но когда я пытаюсь связать все это вместе, я получаю ошибки ссылок, говоря, что существует множество определений всех встроенных функций - оба из них у меня есть вызванный в моей библиотеке обложек С++ и те, которые у меня нет, в основном что-то, что было определено inline в заголовках, получило функцию, созданную для него как в библиотеке C, так и в библиотеке С++.
Он не вызывает множественных ошибок определения, когда включенные файлы используются несколько раз в разных файлах .c или .cpp в одном проекте; проблема в том, что он генерирует одно определение для каждой библиотеки.
Как/почему компилятор генерирует функции и символы для этих встроенных функций в обеих библиотеках? Как я могу заставить его прекратить генерировать их в моем коде? Есть ли инструмент, который я могу запустить, чтобы удалить дублирующиеся функции из файла .a или способ заставить компоновщик игнорировать несколько определений?
(FYI, сторонняя библиотека включает в себя #ifdef __cplusplus и extern "C" охранники во всех своих заголовках, так или иначе, если бы это была проблема, это не вызвало бы множественное определение символа, это вызовет противоположную проблему, потому что символ будет undefined или, по крайней мере, отличается.)
Примечательно, что ошибки ссылок не возникают, если я ссылаюсь на библиотеку DL библиотеки третьей стороны; однако затем я получаю странные ошибки выполнения, которые, похоже, связаны с моим кодом, имеющим собственную версию функций, которые он должен вызывать из DLL. (Как будто компилятор создает локальные версии функций, которые я не запрашивал.)
Подобные версии этого вопроса были заданы раньше, однако я не нашел ответа на мою ситуацию ни в одном из них:
Ответ на этот вопрос заключался в том, что плакат был многозначительным определяющим переменным, моя проблема - множественное определение встроенных функций: Повторные ошибки множественного определения из включения одного и того же заголовка в несколько cpps
Это была программа MSVC, но я использую mingw; Кроме того, проблемой постеров в этом вопросе было определение конструктора класса С++ вне тела класса в заголовке, в то время как моя проблема связана с встроенными функциями C: Static Lib Multiple Definition Проблема
Этот дурак переименовал весь свой C-код в виде файлов на С++, а его код C не был С++ - безопасным: Множественное определение множества std:: функций при связывании
Этот просто хотел узнать, почему нарушение правила определения не было ошибкой: непредсказуемое поведение функций Inline с различными определениями