Makefile:静态库与动态库

CC = gcc

COMPILER_FLAGS = -O2

objects = mathApi.o main.o
bin = hello.exe
static = libmath.a
shared = libmath.so

all:main

main:$(objects)
        $(CC) -o $(bin) $(objects)

static:mathApi.o
        ar cr $(static) mathApi.o

shared:mathApi.o
        $(CC) $(COMPILER_FLAG) mathApi.o -shared -fPIC -o $(shared)

.PHONY: clean
clean:
        rm -f $(objects) $(bin)

C/C++混合编程

在C和C++混用的情况下,因为导出符号不同,链接时需要注意,有两种做法让C和C++兼容:

//test.cpp
extern "C"{
#include "mathApi.h"
}

或者直接在头文件中进行处理:

//mathApi.h
#ifdef __cplusplus
extern "C"{
#endif

//....

#ifdef __cplusplus
}
#endif

可以试用nm命令查看导出函数:

nm libmathApi.a

另外,遇到个蛋疼的问题,无论如何编译都提示: Undefined reference to..,后来发现,-l选项必须放在源文件后面:

#wrong
#g++ -o test.exe -I. -L. -lmathApi test.cpp 
g++ -o test.exe -I. -L. test.cpp -lmathApi