在项目实践中,经常遇到C和C++混合编程的情况。

目前的业务需求是:

c写的几个文件,和一个C++文件要整合为一个动态库,被C++调用。而这个动态库的生成过程中,会链接几个基础的开发库,比如libz,libpcre,libm等。

一.C和C++混合编译动态库的Makefile

编写这样的Makefile来生成一个正确的so库很重要,下面是一个正确的Makefile的写法:

CC = gcc
C++ = g++
LINK = g++LIBS = -lz -lm -lpcre
#must add -fPIC option
CCFLAGS = $(COMPILER_FLAGS) -c -g -fPIC
C++FLAGS = $(COMPILER_FLAGS) -c -g -fPICTARGET=libad.soINCLUDES = -I. -I../../C++FILES = main.cpp \../../hookmask.cpp
CFILES = cJSON.c ZipCoding.c TransferCoding.c mem_manage.cOBJFILE = $(CFILES:.c=.o) $(C++FILES:.cpp=.o)all:$(TARGET)$(TARGET): $(OBJFILE)$(LINK) $^ $(LIBS) -Wall -fPIC -shared -o $@%.o:%.c$(CC) -o $@ $(CCFLAGS) $< $(INCLUDES)%.o:%.cpp$(C++) -o $@ $(C++FLAGS) $< $(INCLUDES)install:tsxs -i -o $(TARGET)clean:rm -rf $(TARGET)rm -rf $(OBJFILE)

注意:

1.如果LIBS的位置放置不对,这几个基础库将不会编进so中。LIBS只应该在最后链接为so时才调用,前面编译c和cpp文件时用不到。

2.c源文件放到CFILES宏后面, cpp文件放到C++Files宏后面,第三方库放到LIBS宏后面,头文件的包含路径放到INCLUDES后面,库文件的包含路径放到使用-L./等表达式放到LIBS中的开头即可。

3.这里严格区分c和cpp文件的目的是,c文件使用gcc编译,而cpp文件会使用g++编译,它们必须严格区分开。

下面是依据上面Makefile编译后得到的正确的截图

二.全部是C文件编译的Makefile

如果全是c的几个文件来编译一个动态库,则相应的Makefile文件编写如下:

gcc -g  cJSON.c ad-module.c -lm -lz -lpcre -Wall -fPIC -shared -o ad_module.so

这里 -lm -lz -lpcre一定要放在-fPIC -shared前面,否则生成的动态库不会包含-lm -lz -lpcre

C和C++混合编程的Makefile的编写!相关推荐

  1. Madagascar和MPI混合编程的Makefile文件配置

    本人从事Geophysics的研究,最近在尝试用Madagascar和MPI混合编程,小有收获,现在贴出Makefile文件的配置,供大家参考. # Makefile for CPU program ...

  2. CUDA、SU、MPI和Madagascar混合编程的Makefile文件配置

    本人从事地震勘探的科研工作,在Ubuntu系统中用CUDA.SU.MPI和Madagascar做C语言的混合编程.多语言混合编程,关键之处在于Makefile文件的配置.在此给出一个简单的示例,供大家 ...

  3. Mpi与Cuda混合编程(Makefile)

    需要建立一个.c的MPI程序和一个.cu的CUDA程序,MPI程序中调用CUDA中的函数来完成并行与GPU的混合编程,我查询了很多资料和博客,最终得出结论,还是Google比较强大,百度什么的还是搜不 ...

  4. Linux编程——入门级Makefile文件编写

    前言 1.在Linux开发环境中,编写Makefile文件是一个必须的技能,虽然现在有好多IDE可以自动生成所需要的Makefile文件,但有时能看懂Makefile文件也是更好的了解项目的编译过程. ...

  5. Gtk与Cuda混合编程

    大家都知道,不同的编译器有不同的-L和-I,而在编译过程中要实现两种编译器的混合使用,利用Makefile是一个很好地解决方案,比如之前在mpi与cuda混合编程中讨论的那样,基于图形界面的GTK编程 ...

  6. C 和 C++ 混合编程

    http://fangzhzh.info/blog/mixing-c-and-cpp-programming.html 在最近的arm开发中,因为一些特定的需求,需要使用从C文件中调用以前C++程序中 ...

  7. matlab两个多项式相除,C++和MATLAB混合编程求解多项式系数(矩阵相除)

    摘要:MATLAB对于矩阵处理是非常高效的,而C++对于矩阵操作是非常麻烦的,因而可以采用C++与MATLAB混合编程求解矩阵问题. 主要思路就是,在MATLAB中编写函数脚本并使用C++编译为dll ...

  8. 怎样用matlab打开mw文,C# matlab混合编程 MWArray使用笔记

    C# matlab混合编程 徐凯Email:xukai19871105@http://www.doczj.com/doc/1a6e191fff00bed5b9f31dbf.html 这几天突然想搞一搞 ...

  9. matlab2014a + win764bit + vs2013混合编程(.m转成dll供C++调用)

    在matlab中可以通过mbuild工具将.m文件编译成dll文件供外部的C++程序调用,这样就可以实现matlab和C++混合编程的目的. 1. 使用matlab生成dll文件 1.1 首先需要带有 ...

最新文章

  1. ngrok服务器搭建_C/C++ Linux 后台服务器开发高级架构师学习知识路线总结
  2. dial tcp 10.96.0.1:443: getsockopt: no route to host --- kubernetes(k8s)DNS 服务反复重启
  3. 趣学python3(48)--列出所有目录及子目录文件
  4. 三十二、深入Python中的文件操作
  5. 搞定python不就那么点事吗?
  6. 小米组织架构调整:雷军兼任中国区总裁 组建大家电部门
  7. 手机付费未成规模 阅读市场付费意愿萎缩
  8. everything搭配什么软件_重磅推荐一款神级工具软件!有了它,90%的软件都可以卸载了!...
  9. python做excel自动化-Python如何控制Excel实现自动化办公
  10. 智伴机器人传销_智伴机器人是传销吗?
  11. 无线上网认证之Portal认证——企业WiFi管家
  12. 学计算机的怎么防辐射,一种学生用防辐射计算机的制作方法
  13. “不限流量卡”真的不限量,但是却限制了这些!
  14. gif软件(ShareX)
  15. Elastic:使用 Elastic Stack 来监督系统日志及指标
  16. python基础:web =html+ python
  17. jvm虚拟机基础知识--、java内存区域(1)
  18. 域名服务是什么意思?
  19. 基于Web html的“我的家乡”网站前端设计
  20. 四、Pinia 的安装及其基本使用

热门文章

  1. js实现双击后网页自己主动跑-------Day55
  2. Facebook 与 Google 正在主导在线身份验证市场
  3. 《OpenCV3编程入门》学习笔记4 OpenCV数据结构与基本绘图
  4. 学习linux要会mysql吗_linux 学习 mysql安装到连接
  5. python 面板数据分析_科学网—Python中的结构化数据分析利器-Pandas简介 - 郑俊娟的博文...
  6. python xpath用法_Python--xpath的使用
  7. html 右边框变短,HTML / CSS:使边框右侧高度动态化
  8. mysql根据两列去重复_mysql对两列去重复数据库
  9. android post请求_Vue 网络请求框架 axios 使用教程
  10. mysql 表引擎无法更新_Mysql安装archive引擎更新表引擎