Множественное определение встроенных функций при связывании статических библиотек

У меня есть программа на C ++, которую я компилирую с помощью mingw (gcc для Windows). Использование TDM-релиза mingw, включающего gcc 4.4.1. Исполняемый файл ссылается на два файла статической библиотеки (.a): один из них - сторонняя библиотека, написанная на C; другая - библиотека C ++, написанная мной, которая использует библиотеку C и предоставляет мой собственный C ++ API.

(На мой взгляд, чрезмерная) часть функциональности библиотеки C реализована во встроенных функциях. Вы не можете избежать включения встроенных функций, когда используете API библиотеки C, но когда я пытаюсь связать все это вместе, я получаю ошибки ссылки, говорящие о множественном определении всех встроенных функций - обе у меня есть Вызванный в моей библиотеке-оболочке C ++, и в которой у меня ничего нет, по сути, все, что определено в заголовках, встроено в библиотеку C и библиотеку C ++.

Это не вызывает множественных ошибок определения, когда включаемые файлы используются несколько раз в разных файлах .c или .cpp в одном и том же проекте; проблема только в том, что она генерирует одно определение для каждой библиотеки.

Как / почему компилятор генерирует функции и символы для этих встроенных функций в обеих библиотеках? Как я могу заставить это прекратить генерировать их в моем коде? Можно ли запустить инструмент для удаления дублирующихся функций из файла .a или способ заставить компоновщик игнорировать несколько определений?

(К вашему сведению, сторонняя библиотека включает защиту #ifdef __cplusplus и extern «C» во всех своих заголовках; в любом случае, если бы это было проблемой, это не вызвало бы множественное определение символа, это вызвало бы противоположную проблему, поскольку символ быть неопределенным или хотя бы другим.)

Примечательно, что ошибки ссылки НЕ возникают, если я ссылаюсь на стороннюю DLL-библиотеку C; однако затем я получаю странные сбои во время выполнения, которые, похоже, связаны с моим кодом, имеющим собственную версию функций, которые он должен вызывать из DLL. (Как будто компилятор создает локальные версии функций, которые я не просил.)

Подобные версии этого вопроса задавались ранее, однако я не нашел ответа на мою ситуацию ни в одном из них:

Ответ на этот вопрос состоял в том, что плакат был многократно определяющимпеременныеМоя проблема заключается в множественном определении встроенных функций:Многократные ошибки определения из-за включения одного и того же заголовка в несколько cpps

Это была программа MSVC, но я использую mingw; Кроме того, проблемой автора в этом вопросе было определение конструктора класса C ++ вне тела класса в заголовке, в то время как моя проблема с встроенными функциями C:Задача многократного определения статического Lib

Этот дурак переименовал весь свой код C в файлы C ++, а код C не был безопасным для C ++:Множественное определение множества функций std :: при связывании

Этот просто хотел знать, почему нарушение одного правила определения не было ошибкой:непредсказуемое поведение встроенных функций с разными определениями

Ответы на вопрос(1)

Ваш ответ на вопрос