gcc: связывание библиотеки C в приложении C ++ приводит к ошибкам «множественного определения» - PullRequest
3 голосов
/ 18 мая 2011

У меня есть рабочая библиотека C, которую я хочу связать с приложением C ++, используя gcc, но компоновщик (g ++) выдает мне ошибку «множественное определение». С приложением C и gcc это работает. Все заголовки, определяющие интерфейс, содержат:

#ifdef __cplusplus 
extern "C" {
#endif

Я проверил библиотеку с помощью команды "nm", и у нее есть несколько определений метода (данный метод не из открытого интерфейса).

Мои вопросы:

  1. Почему в моей библиотеке несколько определений (некоторые имеют T, а другие U)?

  2. Почему это работает, если приложение, включая файл, является приложением C (я использую -Wall для сборки)?

  3. Нужен ли мне какой-либо специальный атрибут или использовать определенное расширение файла, чтобы он работал, или мне нужно вернуться в школу программирования :)?

Обращая больше внимания на файл lib.a, я вижу, что один из объектов включен дважды. Например, у меня есть два раздела для одного и того же объекта:

 obj1.o
 00000000     T    Method

 obj2.o
 00000000     T    Hello

 obj1.o
 00000000     T    Method

Полагаю, в этом проблема?

Любая помощь очень ценится.

Ответы [ 2 ]

1 голос
/ 19 мая 2011

после игры я обнаружил, что на самом деле вся командная строка (это своего рода сложное приложение с автоматической компиляцией и связыванием) содержала параметр --whole-archive до включения библиотеки C.Перемещение библиотеки после --no-whole-archive решило проблему.

Оригинальная команда

   gcc -Wl,**--whole-archive** -l:otherlibs *-Llibpath -l:libname* Wl,**--no-whole-archive** -o myApp hello.c

Исправлена ​​команда

   gcc -Wl,**--whole-archive** -l:otherlibs Wl,**--no-whole-archive** *-Llibpath -l:libname* -o myApp hello.c

Спасибо всем за помощь, ребятаи извините, если я не предоставил достаточно / точную информацию.

С наилучшими пожеланиями

1 голос
/ 18 мая 2011

Мое странное предположение состоит в том, что "#define BLAHBLAH_H " и "#ifndef BLAHBLAH_H / #endif" установлены вне вещи "extern" C "{} '.

...