C使用的通用Makefile

Makefile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# Source file.
# Automatically finds all.c and.cpp files and defines the target as a.o file with the same name.
# The *.c save in src directory.
SOURCE := $(wildcard ./src/*.c) $(wildcard *.cpp)
OBJS := $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(SOURCE)))

# Target you can change test to what you want.
TARGET := demo

# Compile and lib parameter.
CC := gcc
LIBS := -lpthread -lm
LDFLAGS :=
DEFINES :=
# The *.o save in include directory.
INCLUDE := -I ./include
CFLAGS := -Wall $(DEFINES) $(INCLUDE)
CXXFLAGS:= $(CFLAGS) -DHAVE_CONFIG_H


.PHONY : everything objs clean veryclean rebuild

everything : $(TARGET)

all : $(TARGET)

objs : $(OBJS)

rebuild: veryclean everything

clean :
rm -fr ./src/*.so
rm -fr ./src/*.o
rm -rf $(TARGET)

veryclean : clean
rm -fr $(TARGET)

$(TARGET) : $(OBJS)
$(CC) -o $@ $(OBJS) $(LDFLAGS) $(LIBS)

C实现

同步(sync)

A.h
1
2
3
4
5
6
7
8
9
10
11
#ifndef A_H
#define A_H

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

typedef void (*callback)(int a);
void callback_func(int a, callback callback_);

#endif // A_H
A.c
1
2
3
4
5
6
7
8
9
#include "stdio.h"
#include "A.h"

void callback_func(int a, callback callback_)
{
printf("A:start\n");
callback_(a);
printf("A:end\n");
}
B.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#include "A.h"

void bcallback(int a)
{
//do something
printf("B:start\n");
printf("a = %d\n",a);
sleep(5);
printf("B:end\n");
}

int main()
{
callback_func(4, bcallback);
return 0;
}

异步(线程)

A.h
1
2
3
4
5
6
7
8
9
10
11
12
#ifndef A_H
#define A_H

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

typedef void (*callback)(int a);
void* callback_thread(void *parm);
void callback_func(int a, callback callback_);

#endif // A_H
A.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>

#include "stdio.h"
#include "A.h"

typedef struct parameter{
int a ;
callback callback_;
}parameter;

void* callback_thread(void *param)
{
parameter *param_ = (parameter*) param;
sleep(5);
param_->callback_(param_->a);
return NULL;
}

void callback_func(int a, callback callback_)
{
printf("A:start\n");
// Create the enter param data.
parameter *param = malloc(sizeof(parameter));
param->a = a;
param->callback_ = callback_;
// Create thread to finish B want.
pthread_t pid;
pthread_create(&pid, NULL, callback_thread, (void *) param);
sleep(1);
printf("A:run\n");
sleep(1);
printf("A:run\n");
sleep(1);
printf("A:end\n");
// Block Wait B end;
pthread_join(pid, NULL);
free(param);
}
B.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#include "A.h"

void bcallback(int a)
{
//do something
printf("B:start\n");
printf("a = %d\n",a);
sleep(1);
printf("B:run\n");
sleep(1);
printf("B:run\n");
sleep(1);
printf("B:run\n");
sleep(1);
printf("B:end\n");
}

int main()
{
callback_func(4, bcallback);
return 0;
}