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++应该如何。。。
Mac下将C程序创建为动态链接库再由另一个C程序调用的更多相关文章
- mac下普通用户无法创建crontab的问题解决
想在mac下弄一个crontab定时任务,以为会像linux上那样顺利那,结果碰壁了,报错信息例如以下: ➜ autoshell crontab -ecrontab: no crontab for ...
- Mac下maven工程的创建,并搭建SSH环境
最近项目有用到maven,就特地学了一下.maven的一句话攻略就是,项目托管.帮你解决各种项目琐事:清理,导包....等等. 首先先到apach官网去下载一个maven的包,http://maven ...
- [如何在Mac下使用gulp] 1.创建项目及安装gulp
1.创建项目 2.安装gulp 3.创建gulpfile.js文件 4.运行gulp 创建项目 -创建项目文件夹命名为firstGulp,并在firstGulp目录下运行 npm init .npm ...
- 用C#给程序加启动画面并只允许一个应用程序实例运行
. 启动画面类: public class SplashForm : System.Windows.Forms.Form { private System.Windows.Forms.PictureB ...
- Java笔记:编写第一个Java程序
2017.6.17 1.编写第一个Java程序 创建text文本,命名第一个Java程序.txt 在里面编写Java代码 public class Demo1{ public static void ...
- mac 下基于firebreath 开发多浏览器支持的浏览器插件
mac 下基于firebreath 开发多浏览器支持的浏览器插件 首先要区分什么是浏览器扩展和浏览器插件;插件可以像本地程序一样做的更多 一. 关于 firebreath http://www.fir ...
- Mac下Android配置及unity3d的导出Android
昨晚实在弄的太晚了,费尽脑汁才弄出来. ok,关于mac下的eclipse的安卓配置,我仅仅贴一个网址,就ok了 http://developer.android.com/sdk/index.html ...
- OD学习笔记10:一个VB程序的加密和解密思路
前边,我们的例子中既有VC++开发的程序,也有Delphi开发的程序,今天我们给大家分析一个VB程序的加密和解密思路. Virtual BASIC是由早期DOS时代的BASIC语言发展而来的可视化编程 ...
- 编译:一个 C 程序的艺术之旅(转载)
C 程序为什么要编译才能执行?一个 C 程序在变成可执行文件的过程中,为什么要经过预处理.编译.汇编.链接这四道工序?让我们从这段简单的 C 程序开始. 为什么要编译 这并不是一个简单的问题.我们知道 ...
随机推荐
- SeaJS简介一:由来,特点以及优势
由来: 在软件开发过程中,模块化编程思想已经习以为常了,模块化编程不仅仅给开发团队带来效率方面上的好处,还能够让开发的项目或者产品维护成本大大降低. 那么,在WEB开发过程中JS脚本语言已经不可或缺了 ...
- c# WinForm 边框阴影窗体
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- 【Android】Android中不同手机分辨率适配问题
在项目开发的过程中,同一个布局对应不同的手机会显示出不同的效果.导致这个现象产生的原因是不同手机的分辨率不同.在android sdk提供的帮助文档中,我们可以看到各种手机的分辨率和对应的屏大小.QV ...
- js的delete和void关键字
delete关键字 delete关键字的作用: 删除对象的属性 语法:delete 对象.属性 可以删除没有使用var关键字声明的全局变量(直接定义在window上面的属性) delete关键字的 ...
- CentOS 6.7 配置LVM (逻辑卷管理)
LVM 简介 LVM是逻辑盘卷组管理 (Logical Volume Manager) 的简称. LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分区管理的灵活性,在一定程度上解决普通磁盘分区带来 ...
- SUBSTRING_INDEX()
http://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_substring-index ) DEFAULT 'fru ...
- timedatectl — Control the system time and date
timedatectl --help 的执行结果如下: timedatectl [OPTIONS...] COMMAND ... Query or change system time and dat ...
- Docker+Jenkins_自动化持续集成环境搭建
前一篇文章里已经在内网环境搭建好docker 详见:https://www.cnblogs.com/befer/p/9107503.html, 现在接着搭建一个Docker+Jenkins的集成环境 ...
- (2.14)Mysql之SQL基础——游标
(2.14)Mysql之SQL基础——游标 关键词:Mysql游标 -- (1)定义游标 declare cur_name cursor for select * from table_name wh ...
- POJ -1062 昂贵的聘礼(前向星 && SPFA)
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u013497151/article/details/30299671 题目链接:id=1062&qu ...