分享

C和C++混合编程的Makefile的编写!

 XeonGate 2020-03-11

https://blog.csdn.net/tao_627/article/details/38148425

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

目前的业务需求是:

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

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

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

  1. CC = gcc
  2. C++ = g++
  3. LINK = g++
  4. LIBS = -lz -lm -lpcre
  5. #must add -fPIC option
  6. CCFLAGS = $(COMPILER_FLAGS) -c -g -fPIC
  7. C++FLAGS = $(COMPILER_FLAGS) -c -g -fPIC
  8. TARGET=libad.so
  9. INCLUDES = -I. -I../../
  10. C++FILES = main.cpp \
  11. ../../hookmask.cpp
  12. CFILES = cJSON.c ZipCoding.c TransferCoding.c mem_manage.c
  13. OBJFILE = $(CFILES:.c=.o) $(C++FILES:.cpp=.o)
  14. all:$(TARGET)
  15. $(TARGET): $(OBJFILE)
  16. $(LINK) $^ $(LIBS) -Wall -fPIC -shared -o $@
  17. %.o:%.c
  18. $(CC) -o $@ $(CCFLAGS) $< $(INCLUDES)
  19. %.o:%.cpp
  20. $(C++) -o $@ $(C++FLAGS) $< $(INCLUDES)
  21. install:
  22. tsxs -i -o $(TARGET)
  23. clean:
  24. rm -rf $(TARGET)
  25. 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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多