(GNU)C++调用C写的动态库

    技术2022-05-11  69

    这几天一直编译不通过,现在才发现原来是这样的问题,应该在C++代码的声明中加入:extern "C" 下面是完整例子。 库:libhello.c #include  < stdio.h > void  print_hello() {        printf("Hello, library. ");} 用来引用库的头:libhello.h,注意这里的extern "C"但是如果用C调用的话,却不能这么写,否则编译不通过,不过可以用#ifdef __cplusplus来判断是C还是C++,不过后面的{}有时也可以省略 #ifndef _LIBHELLO_ #define  _LIBHELLO_ #ifdef __cplusplus extern   " C "   {#endif        void print_hello();#ifdef __cplusplus} #endif #endif 例子程序(C++):usehello.cc #include  " libhello.h " int  main( int  argc,  char   *  argv[]) {        print_hello();        return 0;} Makefile: all: usehellolibhello . so: libhello . so . 0         ln -sf libhello . so . 0  libhello . solibhello . so . 0 : libhello . so . 0.0         ln -sf libhello . so . 0.0  libhello . so . 0 libhello . so . 0.0 : libhello . o        gcc -shared -Wl , -soname , libhello . so . 0  -o libhello . so . 0.0  libhello . o -lclibhello . o: libhello . c        gcc -fPIC -Wall -c libhello . c -o libhello . ousehello . o: usehello . cc        g ++  -c -o usehello . o usehello . ccusehello: libhello . so usehello . o        g ++  -o usehello -L .  -lhello usehello . oclean:        rm *so* * . o usehello . PHONY: clean all 编译:make 执行:LD_LIBRARY_PATH=. ./usehello

    最新回复(0)