zoukankan      html  css  js  c++  java
  • Mac下将C程序创建为动态链接库再由另一个C程序调用

    写C的时候需要调用之前的一个C程序,想用动态链接库的方式。Mac下的动态链接库是dylib,与Linux下的.os或Windows下的.dll不同。由于之前没有接触过,所以翻了大量的博客,然而在编译过程中一路error。。。还是没能解决问题。最后看了苹果官方的关于动态链接库的介绍https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/DynamicLibraries/000-Introduction/Introduction.html#//apple_ref/doc/uid/TP40001908-SW1,终于顺利通过了。原文是英文文档,建议大家看看,不想看的也可以看我的博客内容。

    下面简要说一下我的具体做法。

    C生成动态链接库

    假设你之前有一个function.c,我们现在需要调用它,先把它做成一个动态链接库。我是直接把这里面的main函数改了一下名字为enmain:

    /*file: function.c*/
    ......
    void enmain() {
        fun1();
        fun2();
        ...
    }
    

    在与function.c的同目录下新建一个function.h文件,里面就是对你要调用的函数的申明。因为我是需要调用function整个程序,所以只要申明enmain这个函数部分:

    /*file: function.h*/
    void enmain();
    

    这时候.h文件就写好了,我们需要回过来对之前的function.c文件做一些修改补充:

    • 头文件加上
    /*file: function.c*/
    #include"function.h"    //注意是用引号
    #define EXPORT __attribute__((visibility("default")))    //具体原因可以看苹果官方的解释,我上面有贴链接
    
    • 在需要调用的函数前面加一行EXPORT
        /*file: function.c*/
        EXPORT
        void enmain() {
            fun1();
            fun2();
            ...
        }
    

    都修改好后,我们开始编译。在终端输入如下语句:

    clang -dynamiclib -std=gnu99 function.c -current_version 1.0 -compatibility_version 1.0 -fvisibility=hidden -o libfunction.A.dylib
    

    然后在与function.c的同目录下会出现一个libfunction.A.dylib。至此,动态链接库已经生成完毕。

    C调用动态链接库

    假设我写了一个程序test.c需要调用刚刚的function动态链接库。由于我这个例子里面只导出了一个函数就是enmain(),实际操作的时候,可以导出.c文件中的多个函数。

    • 头文件加上
        /*file: test.c*/
        #include"function.h"
    
    • 在需要用到enmain()的时候,就像标准库函数一样正常使用:
        /*file: test.c*/
        enmain();
    

    然后编译:

    clang test.c libfunction.A.dylib -o test
    

    运行:

    ./test
    

    注意
    之前我写的function是.cpp文件,在将其编译为dylib时出现错误:

    error: invalid argument '-std=gnu99' not allowed with 'C++/ObjC++'
    

    所以后来改写为纯C就通过了。现在还不知道C++应该如何。。。

  • 相关阅读:
    Java面试题:==运算符与equals方法的区别
    STS或eclipse中导入新项目出现红色感叹号红色叉叉的问题
    SpringBoot+SpringDataJpa快速上手(基本CRUD)
    Java-数组拷贝
    Java-数组拷贝
    最小高度树Java版本(力扣)
    macOS安装minikube
    测试面试LeetCode系列:字符串的左旋转
    测试面试LeetCode系列:按既定顺序创建目标数组
    systemd的文件描述符限制引发的问题
  • 原文地址:https://www.cnblogs.com/Christen/p/6680163.html
Copyright © 2011-2022 走看看