• 如何实现.so共享库文件


    .so共享库相当于window中的.DLL文件

    两个进程同时调用了.so文件,进程就会加载的.so文件到各自的内存空间,而不能实现进程间通讯。

    .so文件编译的方法:

     -so文件不需要main文件,即使有也不会被执行。

    -编译gcc时候需要加-fPIC选项,可以产生与位置无关的代码。(首地址,偏移地址)

    -链接的时候gcc需要加-shared选项,指示生成一个共享库文件。

    -共享库文件需以lib开头,扩展名为.so。

    ###################动态库的编译makefile文件
    .SUFFIXES: .c .o


    SRCS=libso.c
    OBJS=$(SRCS:.c=.o)
    EXES=libso.so
    CC=gcc

    start: $(OBJS)
      $(CC) -shared -o $(EXES) $(OBJS) #-o参数写在后面不然会出错
      @echo "------------------ok----------------"
    .c.o:
      $(CC) -g -fPIC -o $@ -c $<
    clean:
      rm -rf $(OBJS)

     ############################

    so文件的使用方法:

     -为了让Linux 可以找到so文件的位置,需要在.bash.profile中添加

     -export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

     -或者将so文件放入linux的系统目录/usr/lib/

     -在c文件中使用so文件,首先需要#inlcude相关头文件。

    gcc连接时候添加-L参数指明so文件存放的路径,-l参数指明so文件名

    以libtest.so文件在当前路径下举例:

    gcc -L.  -ltest  -o a  a.o  ##-ltest有时候需要加载a.o后面否则报错ubantu14.04中

    其中 -L.的意思就是在当前路径下寻找so文件,

    -ltest意思就是要连接libtest.so这个库文件,

    -o a就是编译后可执行文件名为a这个文件。

    .SUFFIXES: .c .o


    SRCS=a.c
    OBJS=$(SRCS:.c=.o)
    EXES=a
    CC=gcc

    start: $(OBJS)
      $(CC) -L.  -ltest  -o $(EXES) $(OBJS) #-o参数写在后面不然会出错
      @echo "------------------ok----------------"
    .c.o: 
      $(CC) -g  -o $@ -c $< 
    clean:
      rm -rf $(OBJS)

    ###############################头文件中同时兼任C/C++

    #ifndef LIBSO_H_
    #define LIBSO_H_

    #ifndef __cplusplus//c++特有的宏定义
    extern "C" //告诉c++编译器这是C代码
    {
    #endif

    int max(int a, int b);
    int add(int a , int b);

    #ifndef __cplusplus
    }
    #endif

    #endif /* LIBSO_H_ */

    ##################################################

    http://www.jb51.net/article/46005.htm

  • 相关阅读:
    课时28:文件:因为懂你,所以永恒
    课时27:集合:在我的世界里,你就是唯一
    课时26:字典:各种内置方法
    课时25:字典:当索引不好用时
    课时24:递归:汉诺塔
    课时23:递归:这帮小兔崽子
    课时22:函数:递归是神马
    有序表查找-折半查找
    C#
    C#
  • 原文地址:https://www.cnblogs.com/yuankaituo/p/4341635.html
Copyright © 2020-2023  润新知