C和C++混合编程的Makefile的编写!
在项目实践中,经常遇到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的编写!相关推荐
- Madagascar和MPI混合编程的Makefile文件配置
本人从事Geophysics的研究,最近在尝试用Madagascar和MPI混合编程,小有收获,现在贴出Makefile文件的配置,供大家参考. # Makefile for CPU program ...
- CUDA、SU、MPI和Madagascar混合编程的Makefile文件配置
本人从事地震勘探的科研工作,在Ubuntu系统中用CUDA.SU.MPI和Madagascar做C语言的混合编程.多语言混合编程,关键之处在于Makefile文件的配置.在此给出一个简单的示例,供大家 ...
- Mpi与Cuda混合编程(Makefile)
需要建立一个.c的MPI程序和一个.cu的CUDA程序,MPI程序中调用CUDA中的函数来完成并行与GPU的混合编程,我查询了很多资料和博客,最终得出结论,还是Google比较强大,百度什么的还是搜不 ...
- Linux编程——入门级Makefile文件编写
前言 1.在Linux开发环境中,编写Makefile文件是一个必须的技能,虽然现在有好多IDE可以自动生成所需要的Makefile文件,但有时能看懂Makefile文件也是更好的了解项目的编译过程. ...
- Gtk与Cuda混合编程
大家都知道,不同的编译器有不同的-L和-I,而在编译过程中要实现两种编译器的混合使用,利用Makefile是一个很好地解决方案,比如之前在mpi与cuda混合编程中讨论的那样,基于图形界面的GTK编程 ...
- C 和 C++ 混合编程
http://fangzhzh.info/blog/mixing-c-and-cpp-programming.html 在最近的arm开发中,因为一些特定的需求,需要使用从C文件中调用以前C++程序中 ...
- matlab两个多项式相除,C++和MATLAB混合编程求解多项式系数(矩阵相除)
摘要:MATLAB对于矩阵处理是非常高效的,而C++对于矩阵操作是非常麻烦的,因而可以采用C++与MATLAB混合编程求解矩阵问题. 主要思路就是,在MATLAB中编写函数脚本并使用C++编译为dll ...
- 怎样用matlab打开mw文,C# matlab混合编程 MWArray使用笔记
C# matlab混合编程 徐凯Email:xukai19871105@http://www.doczj.com/doc/1a6e191fff00bed5b9f31dbf.html 这几天突然想搞一搞 ...
- matlab2014a + win764bit + vs2013混合编程(.m转成dll供C++调用)
在matlab中可以通过mbuild工具将.m文件编译成dll文件供外部的C++程序调用,这样就可以实现matlab和C++混合编程的目的. 1. 使用matlab生成dll文件 1.1 首先需要带有 ...
最新文章
- ngrok服务器搭建_C/C++ Linux 后台服务器开发高级架构师学习知识路线总结
- dial tcp 10.96.0.1:443: getsockopt: no route to host --- kubernetes(k8s)DNS 服务反复重启
- 趣学python3(48)--列出所有目录及子目录文件
- 三十二、深入Python中的文件操作
- 搞定python不就那么点事吗?
- 小米组织架构调整:雷军兼任中国区总裁 组建大家电部门
- 手机付费未成规模 阅读市场付费意愿萎缩
- everything搭配什么软件_重磅推荐一款神级工具软件!有了它,90%的软件都可以卸载了!...
- python做excel自动化-Python如何控制Excel实现自动化办公
- 智伴机器人传销_智伴机器人是传销吗?
- 无线上网认证之Portal认证——企业WiFi管家
- 学计算机的怎么防辐射,一种学生用防辐射计算机的制作方法
- “不限流量卡”真的不限量,但是却限制了这些!
- gif软件(ShareX)
- Elastic:使用 Elastic Stack 来监督系统日志及指标
- python基础:web =html+ python
- jvm虚拟机基础知识--、java内存区域(1)
- 域名服务是什么意思?
- 基于Web html的“我的家乡”网站前端设计
- 四、Pinia 的安装及其基本使用
热门文章
- js实现双击后网页自己主动跑-------Day55
- Facebook 与 Google 正在主导在线身份验证市场
- 《OpenCV3编程入门》学习笔记4 OpenCV数据结构与基本绘图
- 学习linux要会mysql吗_linux 学习 mysql安装到连接
- python 面板数据分析_科学网—Python中的结构化数据分析利器-Pandas简介 - 郑俊娟的博文...
- python xpath用法_Python--xpath的使用
- html 右边框变短,HTML / CSS:使边框右侧高度动态化
- mysql根据两列去重复_mysql对两列去重复数据库
- android post请求_Vue 网络请求框架 axios 使用教程
- mysql 表引擎无法更新_Mysql安装archive引擎更新表引擎