C++ 在C+中使用C共享库+;程序

C++ 在C+中使用C共享库+;程序,c++,c,linux,gcc,g++,C++,C,Linux,Gcc,G++,我很难在用g++编译的程序中链接用gcc编译的共享库。 我使用以下命令通过gcc编译了一个共享库: 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 "$(C

我很难在用g++编译的程序中链接用gcc编译的共享库。 我使用以下命令通过gcc编译了一个共享库:

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-some-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++编译:

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"
问题是g++打印出一个错误:

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
真正的问题是,如果我用gcc编译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"
koldar@Octav:~/Documents/git/Kaboom/custom-object-language/KaboomTest$ ./KaboomTest
OK.
koldar@Octav:~/Documents/git/Kaboom/custom-object-language/KaboomTest$ 
现在我很确定我可以在一个g++编译的程序中链接一个gcc编译的共享库,但是我该怎么做呢?谢谢你的回答,很抱歉我的英语不好

extern "C"
{
#include "Label.h"
}
像这样


像这样。

您是否已使用
外部“C”
声明了您的C函数?您是否可以发布
Label.h
的内容?您是否使用了
extern“C”
?来链接已编译的.so,do-lmylibname。其中libmylibname.so是共享库。如有必要,使用gcc选项添加到linkpath中-L。可能与此问题无关,但您是否在编译对象文件时使用了
-fPIC
?另外,当您确实使用它时,您还应该在最后调用
gcc
将对象链接在一起时使用它。muteryx的答案是正确的:真的,我没有意识到这个技巧!谢谢你的回答!您是否已使用
extern“C”
声明了您的C函数?请发布
Label.h
的内容好吗?您是否使用了
extern“C”
?来链接已编译的.so,do-lmylibname。其中libmylibname.so是共享库。如有必要,使用gcc选项添加到linkpath中-L。可能与此问题无关,但您是否在编译对象文件时使用了
-fPIC
?另外,当您确实使用它时,您还应该在最后调用
gcc
将对象链接在一起时使用它。muteryx的答案是正确的:真的,我没有意识到这个技巧!谢谢你的回答!