首页 > C和C++混合编程的Makefile的编写!

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

更多相关:

  • 本文来自 运维人生 ,作者:fly是个稻草人链接:http://www.ywadmin.com/?id=76误删除linux系统文件了?不用急,本文将给你一个恢复linux文件的方法,让你轻松应对运维中的各风险问题。方法总比问题多~说在前面的话针对日常维护操作,难免会出现文件误删除的操作。大家熟知linux文件系统不同win有回收...

  • 原文来自SecIN社区—作者:WiHat0x00 什么是WebShell渗透测试工作的一个阶段性目标就是获取目标服务器的操作控制权限,于是WebShell便应运而生。Webshell中的WEB就是web服务,shell就是管理攻击者与操作系统之间的交互。Webshell被称为攻击者通过Web服务器端口对Web服务器有一定的操作权限,而...

  • 断电时文件系统发生了什么?硬盘又发生了什么?下一次开机时写到一半的文件在系统层面还在吗?在底层还在吗?更进一步的, 文件系统如何保证事务性, 会不会存在某种极端情况导致例如最后几个bit还没写完, 文件系统却认为它成功了的情况?回答不限任何文件系统,谢谢!下面是「北极」的回复分享断电的一瞬间,很多事情是无法确定的:1. 你无法确定...

  • 接到项目需求。需要搭建一个页面进行交互,慢慢来b (2).jpg使用python django框架进行页面的搭建在项目文件下打开窗口,输入命令;django-admin startproject helloword#在文件helloword/helloword/创建view.py在view.py文件中输入以代码from django....

  • 常见的错误集合解决方案(一)No.1提示错误'Microsoft.VC90.CRT,version="9.0.21022.8"把Microsoft.NET Framework 3.5.1下面的全部勾选上。No.2解决Qt Designer设计的图标但是VS生成不显示问题描述:在Qt designer中为菜单栏和工具栏设计的图标,但是...

  • PCL1.9.1并没有支持vs2015版本的exe版本,然后需要下载PCL的源码重新自己CMake编译出vs2015版本的编译的目的:1、得到支持vs2015的版本的PCL1.9.1 前期准备1、下载PCL源码:https://github.com/PointCloudLibrary/pcl2、下载安装版(主要是为...

  • 下载gcc文档,第三章有详细的build options的介绍。 最近我用到2个关键的option 来定位问题,简单介绍一下: 1. -E: 只是进行预编译,不会编译和link。用于检查宏在代码中的展开是否符合预期; 2.--verbose: 开启verbose mode, 用于输出编译整个过程中的详细信息,可帮助查看build...

  • 浅谈GCC预编译头技术 文/jorge ——谨以此文,悼念我等待MinGW编译时逝去的那些时间。 其 实刚开始编程的时候,我是丝毫不重视编译速度之类的问题的,原因很简单,因为那时我用BASICA。后来一直用到C++ Builder,尽管Borland的广告无时无刻不在吹嘘其编译速度,我却从没有对这个问题上心过,因为心里根本没有“...

  • 在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译。这个编译过程就叫交叉编译。简单地说,就是在一个平台上生成另一个平台上的可执行代码。这里需要注意的是所谓平台,实际上包含两个概念:体系结构(Architecture)、操作系统(Operating System)。同一个体系结构可以运行...

  • 文章目录前言Makefile 编译流程1. 平台变量/环境变量的初始化。2. 编译需要的源码文件变量初始化。3. include 目录的设置。4. 编译的执行逻辑。问题记录1:可能的打包命令`ar` 失效问题5. 执行具体的编译指令问题记录2: jar 包编译...