C与C++混合编程、编译

1. 工程文件架构

drwxrwxr-x 3 JoshYoby JoshYoby 4096 2月  25 15:03 ./
drwxrwxr-x 8 JoshYoby JoshYoby 4096 2月  25 14:45 ../
-rw-rw-r-- 1 JoshYoby JoshYoby  671 2月  25 14:58 Makefile
-rw-rw-r-- 1 JoshYoby JoshYoby  168 2月  25 14:57 my_main.cpp
drwxrwxr-x 2 JoshYoby JoshYoby 4096 2月  25 14:49 temp/
-rw-rw-r-- 1 JoshYoby JoshYoby   67 2月  25 14:54 test.c
-rw-rw-r-- 1 JoshYoby JoshYoby   66 2月  25 14:54 test.h
-rw-rw-r-- 1 JoshYoby JoshYoby  158 2月  25 14:48 tools.cpp
-rw-rw-r-- 1 JoshYoby JoshYoby  188 2月  25 14:42 tools.h

temp目录下只有一个 my_main.c 文件


2. test.c 内容

#include "test.h"

int testAdd(int a, int b)
{
	return (a + b);
}


3. test.h 内容

#ifndef TEST_H
#define TEST_H

int testAdd(int a, int b);

#endif

4. tools.cpp 内容

#include "tools.h"
#ifdef __cplusplus
extern "C"
{
#endif

using namespace std;

void toolsHello()
{
	cout<<"hello world\n"<

5. tools.h 内容

#ifndef TOOLS_H
#define TOOLS_H

#ifdef __cplusplus
#include 
#include 
#endif

#ifdef __cplusplus
extern "C"{
#endif

void toolsHello();

#ifdef __cplusplus
}
#endif

#endif

6. my_main.cpp文件内容
这里展示了如何在.cpp文件中调用.c文件中的函数。

#include 
#include "tools.h"

extern "C"
{
	#include "test.h"
}

using namespace std;

int main()
{
	toolsHello();
	cout << "1 + 2 = " << testAdd(1, 2) <

7. temp/my_main.c文件内容
这里展示了在.c文件中调用.cpp中的函数,前提是.cpp文件中的函数均像tools.cpp一样的写法。

#include 
#include 
#include "tools.h"
#include "test.h"

int main()
{
	toolsHello();
	printf("1 + 2 = %d\n", testAdd(1, 2));
}


8. Makefile文件内容

#指定编译工具
CC = gcc
CPP = g++
LINK = g++
 
LIBS = -lpthread
#编译.so 必须添加 -fPIC 和 -shared 选项  
CCFLAGS = -c -g -fPIC
CPPFLAGS = -c -g -fPIC

#期望得到的执行文件或动态库.so
#TARGET=libxx.so
TARGET=test
 
INCLUDES = -I. #-I../../
 
CPPFILES = $(wildcard *.cpp ../*.cpp)#遍历得到当前目录及上层目录中的所有.cpp文件
CFILES = $(wildcard *.c ../*.c)#遍历得到当前目录及上层目录中的所有.c文件
 
OBJFILE = $(CFILES:.c=.o) $(CPPFILES:.cpp=.o)
 
all:$(TARGET)
 
$(TARGET): $(OBJFILE)
# 编译得到 .so 文件用下面的代码
#	$(LINK) $^ $(LIBS) -Wall -fPIC -shared -o $@
# 编译得到可执行文件用下面的代码
	$(LINK) $^ $(LIBS) -Wall -O2 -o $@

%.o:%.c
	$(CC) -o $@ $(CCFLAGS) $< $(INCLUDES)
 
%.o:%.cpp
	$(CPP) -o $@ $(CPPFLAGS) $< $(INCLUDES)
 
clean:
	rm -rf $(TARGET)
	rm -rf $(OBJFILE)

在当前工程目录下,打开终端窗口,输入 make 命令即可得到 test可执行文件。


你可能感兴趣的:(Linux学习)