Программа C ++ получает неопределенную ссылку на динамическую библиотеку C во время компоновки - PullRequest
0 голосов
/ 03 марта 2010

Я создал динамическую сетевую библиотеку на C. Когда я пытаюсь связать ее в своей программе на C ++, я получаю неопределенную ссылку при первом вызове одной из своих функций в библиотеке. Что я не могу понять, так это то, что я создал небольшую тестовую программу на C, которая использует библиотеку, и она прекрасно связывается.

Может ли кто-нибудь помочь с моей проблемой? Вот шаги, которые я предпринял, чтобы создать свою библиотеку и связать ее.

Создание библиотеки:

  • Код моей библиотеки
  • Скомпилируйте с помощью строки: gcc -c -fPIC -g -Wall ./libnet.c
  • Свяжите объектный файл моей библиотеки и создайте общий объектный файл с помощью строки: gcc -shared -o libnet.so -g -Wall ./libnet.o

Переместите мою библиотеку в соответствующие папки и установите LD_LIBRARY_PATH:

  • Я копирую свою библиотеку в две директории. Один каталог - это тестовая программа C, которая правильно связывает, а другой - программа C ++, которая не связывается должным образом.
  • Я установил переменную среды LD_LIBRARY_PATH для обоих каталогов, которые используют библиотеку

Скомпилируйте и свяжите мою программу:

  • Код моей программы
  • Скомпилируйте все мои файлы .cpp со строкой: g ++ -c -g -Wall ./
  • Свяжите все мои объектные файлы и общую библиотеку, чтобы создать мою программу, с помощью строки: g ++ -o -g -Wall -L./ -lnet

Вот файл make, который я использую. Может, у меня здесь что-то не так?

PPFLAGS = -g -Wall

TARGET = msgfrwdserver

OBJS = msgfrwdserver.o msgfrwdhelper.o msgfrwd.o climsgfrwd.o

LIBS = libnet.so

CPPLP = -L / USR / дома / Крис / разработка / легенды / сервера / монитор -L / USR / дома / Крис / разработка / легенды / сервера / msgfrwd

CPPFILES = ./msgfrwdserver.cpp ./msgfrwdhelper.cpp ./classes/msgfrwd.cpp ./classes/climsgfrwd.cpp

CPPIP = -I./classes -I / USR / дома / Крис / разработка / легенды / ЛИБНЕТ

все: $ {OBJS} $ {TARGET}

$ {TARGET}: $ {OBJS} $ {LIBS}

г ++ -о $ {TARGET} $ {PPFLAGS} -L./-lnet $ {CPPIP} $ {OBJS}

msgfrwdserver.o: ./msgfrwdserver.cpp

g ++ -c $ {PPFLAGS} $ {CPPIP} ./msgfrwdserver.cpp

msgfrwdhelper.o: ./msgfrwdhelper.cpp

g ++ -c $ {PPFLAGS} ./msgfrwdhelper.cpp

msgfrwd.o: ./classes/msgfrwd.cpp

г ++ -с $ {PPFLAGS} ./classes/msgfrwd.cpp

climsgfrwd.o: ./classes/climsgfrwd.cpp

g ++ -c $ {PPFLAGS} $ {CPPIP} ./classes/climsgfrwd.cpp

clean: rm -rf $ {TARGET} * .o * ~ .core ./classes/~

Я действительно понятия не имею, в чем может быть проблема. Любая помощь приветствуется. Нужно ли что-то делать по-другому, чтобы библиотека C работала с программой на C ++?

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

1 Ответ

4 голосов
/ 03 марта 2010

Функции библиотеки C должны иметь определение en extern "C" , чтобы вызывать их из C ++ для перехода к управлению именами.

extern "C" 
{ 
    int test();
}

При использовании extern компилятор Microsoft C ++ будет искать символ " _test ", в противном случае он будет искать "? Test @@ YAHXZ " (имя C ++ управляемая версия int test ())

...