2013-11-15 5 views
1

У меня возникли проблемы с связыванием общей библиотеки, скомпилированной с gcc в программе, скомпилированной с g ++. я совместно используемую библиотеку скомпилирован через GCC, используя следующую команду:Использовать совместно используемую библиотеку C в программе на C++

build-library: activate-library-mode activate-debug-mode build-headers build-c-files build-exe-files 
@echo -e $(cyan)generating shared library...$(plain) 
@for exefile in $(exefiles); do\ 
    echo "$(CC) $(DEBUG) $(EXELIBFLAG) -o $(BINDIR)lib`basename $$exefile .c`.so $(wildcard $(OBJDIR)*.o)";\ 
    $(CC) $(DEBUG) $(EXELIBFLAG) -o $(BINDIR)lib`basename $$exefile .c`.so $(wildcard $(OBJDIR)*.o);\ 
done 

где:

  • CC = GCC
  • ОТЛАДКА = -g
  • EXELIBFLAG = -shared
  • BINDIR = bin/
  • exefiles = src/main.c
  • в * .o файлы компилируются с -fPIC, -g, -Wall некоторые -I и -c опции

Таким образом, в результате Вызывающий:

gcc -g -shared -o bin/libmain.so obj/ClassElement.o obj/ClassHashTable.o obj/ClassHTCell.o obj/IdentifierList.o obj/LabelClassType.o obj/LabelHashTable.o obj/LabelHTCell.o obj/Label.o obj/lexer.o obj/lex-tools.o obj/LexVal.o obj/LocalResourceElement.o obj/LocalResourceHashTable.o obj/LocalResourceHTCell.o obj/main.o obj/main-tools.o obj/memory-tools.o obj/NodeType.o obj/parser.o obj/parser-tools.o obj/PassMode.o obj/ResourceClassType.o obj/ResourceElement.o obj/ResourceHashTable.o obj/ResourceHTCell.o obj/schemaClassType.o obj/schema.o obj/semantic.o obj/SyntaxNode.o 

Я добавил стезю разделяемой библиотеке в LD_LIBRARY_PATH только для целей тестирования:

LD_LIBRARY_PATH=/home/koldar/Documents/git/Kaboom/custom-object-language/CustomProgrammingLanguage/bin: 
export LD_LIBRARY_PATH 

библиотека затем используется следующая программа:

#include "Label.h" 

int main(){ 
    Plabel l=initLabel("hello",LABEL_PACKAGE); //use library function 
    printf("OK.\n"); 
    return 0; 
} 

Эта программа составлена ​​с г ++ с помощью команды:

g++ -I /home/koldar/Documents/git/Kaboom/custom-object-language/CustomProgrammingLanguage/include/ -I /home/koldar/Documents/git/Kaboom/custom-object-language/KaboomTest/cute/ -L /media/Dati/Users/Koldar/Documents/git/Kaboom/custom-object-language/CustomProgrammingLanguage/bin -l main test.c -o "KaboomTest" 

проблемы является г ++ выводит сообщение об ошибке:

test.c: In function ‘int main()’: 
test.c:4: warning: deprecated conversion from string constant to ‘char*’ 
/tmp/ccF7XCBs.o: In function `main': 
test.c:(.text+0x19): undefined reference to `initLabel(char*, LabelClassType)' 
collect2: ld returned 1 exit status 

Реальная проблема заключается в том, что если я составил test.c с НКОЙ Программы работает просто отлично:

gcc -I /home/koldar/Documents/git/Kaboom/custom-object-language/CustomProgrammingLanguage/include/ -I /home/koldar/Documents/git/Kaboom/custom-object-language/KaboomTest/cute/ -L /media/Dati/Users/Koldar/Documents/git/Kaboom/custom-object-language/CustomProgrammingLanguage/bin -l main test.c -o "KaboomTest" 
[email protected]:~/Documents/git/Kaboom/custom-object-language/KaboomTest$ ./KaboomTest 
OK. 
[email protected]:~/Documents/git/Kaboom/custom-object-language/KaboomTest$ 

Теперь я уверен, что я могу связать GCC скомпилированные разделяемую библиотеку в скомпилированной программе г ++, но как я могу это сделать? Спасибо за ответы и извините за мой плохой Английский

+3

Вы объявили свою функцию C с помощью «extern» C «'? –

+2

Не могли бы вы разместить содержание «Label.h»? Вы использовали 'extern 'C" '? – starrify

+0

, чтобы связать скомпилированный .so, do -lmylibname. где libmylibname.so - это общая библиотека. и при необходимости добавить к ссылке путь с опцией gcc -L. – amdixon

ответ

6
extern "C" 
{ 
#include "Label.h" 
} 

Нравится это.

+0

работает как очарование! Большое спасибо! – Koldar

Смежные вопросы