Связывание C ++ с C в GCC - PullRequest
       18

Связывание C ++ с C в GCC

7 голосов
/ 02 сентября 2011

У меня есть одна функция extern "C" int ping(void) в проекте C ++ "static-library". Теперь я хотел бы написать простую программу Hello-World C, которая будет вызывать эту функцию int x = ping();.

Я использую g++ / gcc, но не могу связать исполняемый файл C с общей библиотекой C++. Пожалуйста, как можно это сделать? Не могли бы вы предоставить точные gcc команды?

Редактировать

g++ -c -static liba.cpp
ar rcs liba.a liba.o
gcc -o x main.o -L. -la

и получите:

./liba.a(liba.o):(.eh_frame+0x12): undefined reference to `__gxx_personality_v0'

collect2: ld вернул 1 статус выхода

Ответы [ 3 ]

9 голосов
/ 02 сентября 2011

Возможно, вам придется использовать g ++ в качестве компоновщика, а не gcc.Если функция ping() использует какой-либо STL или исключения, новые и т. Д., Она, вероятно, связывается с libstdc++, который автоматически связывается при использовании g ++ в качестве компоновщика.

1 голос
/ 03 апреля 2013

У меня хорошие результаты при компиляции и компоновке смешанного кода C / C ++ с GCC, но вам обоим нужен "extern C" (явно объявляющий функции как функции C) и связывание библиотек C ++ с помощью -lstdc ++.

Смотри также:

В источнике C ++, каков эффект extern "C"?

В чем разница между g ++ и gcc?

1 голос
/ 02 сентября 2011

Посмотрите на название искажения.Если библиотека C ++ не экспортирует имена «extern C», она становится интересной одним из трех способов, в зависимости от того, какой компилятор использовался для сборки библиотеки.

Даже тогда вы не получите удовлетворительного результата.результаты, так как многие концепции C ++ не будут правильно обрабатываться программой, которая запускается на стороне C ограждения.Вы не думаете, что программа на C на самом деле будет выполнять какие-либо из косвенно называемых статических блоков C ++, когда она не понимает гарантии такого «чужого» языка, не так ли?

Короткая версияистории.Даже если вы программируете на C, если вы хотите правильно обрабатывать библиотеку C ++, вам нужен ваш основной скомпилированный в C ++.

...