связывание кода g ++ с общей библиотекой с помощью gcc - PullRequest
0 голосов
/ 10 марта 2011

Я создал общую библиотеку, используя gcc. Я хотел бы связать эту библиотеку, используя компилятор g ++ с исходным кодом * .c. Пример

test_init.c
#include<stdio.h>
int test_init()
{
   printf(" test init success\n");
   return 0;
}

gcc -shared -o libtest.so test_init.c

test.c

#include<stdio.h>
extern int test_init();
main()
{
   test_init();
}

g++ -I. -L. -ltest test.c

/ tmp / ccuH5tIO.o: в функции main': test.c:(.text+0x7): undefined reference to test_init () 'collect2: ld вернул 1 статус выхода

Примечание: если я компилирую test.c с помощью gcc, это работает, но я хотел бы использовать этот подход из-за других зависимостей. Возможно ли это?

Ответы [ 3 ]

1 голос
/ 10 марта 2011

Как сказал Дирк, измените extern int test_init(); на extern "C" { int test_init(); }

1 голос
/ 10 марта 2011

Вы вызываете подпрограммы C из C ++, объявляя их

 extern "C" {
     ....
 }

Просмотрите несколько файлов заголовков в вашей системе или в Google - это единственный способ сделать это из-за различных систем сигнатур функций междуязыки.

0 голосов
/ 10 марта 2011

Обычно -llibrary должно быть после объектных файлов или файлов c / c ++ в командной строке gcc

g++ -I. -L. test.c -ltest

Компоновщик ищет символы, упомянутые в test.c, после того, как он обработан, а когда вы ставите -llib перед test.c, он просто не может их найти.

Подробнее см. man ld.

Не уверен, как обстоят дела, когда вы используете extern, возможно, что-то другое в этом случае.

...