2. 用c++语言写动态库:
/*
 * libsthcpp.h
 * Declarations for function cppadd //声明函数cppadd
 */
#include "stdio.h"
#include "stdlib.h"
#include "stdarg.h"   //stdandard argument(标准参数),用的都是c的头文件,方便以后c调用?
#ifdef __cplusplus    //参考我之前的文章
extern "C"
{
#endif
 
int cppadd(int x, int y);  //不用类来写c++!没有参考性,凑合看了
#ifdef __cplusplus
}
#endif
 
 
/*
 * libsthcpp.cpp
 * Implementation of function cppadd declared in libsthcpp.h//实现函数
 * in c++ language
 */
#include "libsthcpp.h"
//和之前说的不同,前面说的使用externa "C"关键字,对于c++被c调用的,cpp文件中,也要写上去。
int cppadd(int x, int y)
{
         return x + y;
}
 
#makefile
libsthcpp.so:libsthcpp.o
         g++ -g -shared -Wl libsthcpp.o -lc -o libsthcpp.so
libsthcpp.o:libsthcpp.cc libsthcpp.h
         g++ -g -fPIC -c libsthcpp.cc -o libsthcpp.o
all:libsthcpp.so
clean:
         rm -f *.o *.so
 
make完成后,会生成一个动态库,即libsthcpp.so。为了使其他程序也可以使用该动态库,需要将库文件libsthcpp.so拷贝到/usr/lib目录下(由于权限的问题,一般要以root的身分进行拷贝),为了使其他程序也可以使用该动态库,需要将头文件libsthcpp.h拷贝到/usr/include目录下(由于权限的问题,一般要以root的身分进行拷贝)。
 
2.1 用c语言静态方式调用动态库libsthcpp.so:
/*
 * ctest.c
 * Testing program for libsthcpp.so library
 * in c languange
 **/
#include "libsthcpp.h"
int main(void)
{
         printf("%d\n", cppadd(1, 2));
         return 0;
}
 
#makefile
ctest:ctest.o
         gcc ctest.o -lsthcpp -o ctest
ctest.o:ctest.c
         gcc -c ctest.c -o ctest.o
all:ctest
clean:
         rm -f *.o ctest
 
 
2.2 用c语言动态方式调用动态库libsthcpp.so:
/*cdltest.c*/
#include "stdio.h"
#include "stdlib.h"
#include "dlfcn.h"  //都是使用的这个文件
 
int main(void)
{
         void *handle;
         int (*fcn)(int x, int y);
         const char *errmsg;
        
         /* open the library */
         handle = dlopen("libsthcpp.so", RTLD_NOW);
         if(handle == NULL)
         {
                   fprintf(stderr, "Failed to load libsthc.so: %s\n", dlerror());
                   return 1;
         }
         dlerror();
 
         //*(void **)(&fcn) = dlsym(handle, "cppadd");       //ok in c and c++
         fcn = dlsym(handle, "cppadd");                               //ok in c, but not in c++
         if((errmsg = dlerror()) != NULL)
         {
                   printf("%s\n", errmsg);
                   return 1;
         }
         printf("%d\n", fcn(1, 5));
        
         dlclose(handle);
         return 0;
}
 
#makefile
cdltest:cdltest.o
         gcc cdltest.o -ldl -lsthcpp -o cdltest
cdltest.o:cdltest.c
         gcc -c cdltest.c -o cdltest.o
all:cdltest
clean:
         rm -f *.o cdltest
 
2.3 用c++语言静态方式调用动态库libsthcpp.so:
/*
 * cpptest.cpp
 * Testing program for libsthc.so library written in c language
 * in c++ languange
 * */
#include "libsthcpp.h"
#include "iostream.h"   //终于用了一个c++的东西了
int main(void)
{
         cout << cppadd(1, 2) << endl;
         return 0;
}
 
#makefile   //makefile的内容基本都没什么变化
cpptest:cpptest.o
         g++ cpptest.o -lsthcpp -o cpptest
cpptest.o:cpptest.cpp
         g++ -c cpptest.cpp -Wno-deprecated -o cpptest.o
all:cpptest
clean:
         rm -f *.o cpptest
 
2.4 用c++语言动态方式调用动态库libsthcpp.so:
/*cppdltest.cpp*/
#include "stdio.h"
#include "stdlib.h"
#include "dlfcn.h"   //动态调用的都是一样的,没有使用c++提供的动态调用函数
 
int main(void)
{
         void *handle;
         int (*fcn)(int x, int y);
         const char *errmsg;
        
         /* open the library */
         handle = dlopen("libsthcpp.so", RTLD_NOW);
         if(handle == NULL)
         {
                   fprintf(stderr, "Failed to load libsthc.so: %s\n", dlerror());
                   return 1;
         }
         dlerror();
 
         *(void **)(&fcn) = dlsym(handle, "cppadd");         //ok in c and c++
         //fcn = dlsym(handle, "cppadd");                             //ok in c, but not in c++
         if((errmsg = dlerror()) != NULL)
         {
                   printf("%s\n", errmsg);
                   return 1;
         }
         printf("%d\n", fcn(1, 5));
        
         dlclose(handle);
         return 0;
}
 
#makefile
cppdltest:cppdltest.o
         g++ cppdltest.o -ldl -lsthcpp -o cppdltest
cppdltest.o:cppdltest.cpp
         g++ -c cppdltest.cpp -o cppdltest.o
all:cppdltest
clean:
         rm -f *.o cppdltest