extern "C" int add(int a, int b)
{
return a+b;
}
extern "C" int sub(int a, int b)
{
return a-b;
}
编译参数:Makefile
TARGET = libtest.so
COMPILE = -fPIC
COMPILE += -c
LINK = -shared
CC = g++
GCC = gcc
BUILD_CACHE_DIR=.buildCacheDir
ALLSRC = $(wildcard *.cpp)
ALL_OBJ = $(patsubst %.cpp, $(BUILD_CACHE_DIR)/%.o, $(filter %.cpp, $(ALLSRC)))
.PHYONE:all
all:createDir $(TARGET)
createDir:
@mkdir -p $(BUILD_CACHE_DIR) 2>/dev/null
# @mkdir -p $(INSTALL_PATH)/ 2>/dev/null
$(TARGET):$(ALL_OBJ)
@echo
@echo "------------------------------------------------------------------"
@echo "==== Linking $@ === "
@echo "------------------------------------------------------------------"
$(CC) $(ALL_OBJ) $(LINK) -o $@
@echo "------------------------------------------------------------------"
#编译规则
$(BUILD_CACHE_DIR)/%.o:%.cpp
$(CC) $(COMPILE) $< -o $@
$(BUILD_CACHE_DIR)/%.o:%.c
$(GCC) $(COMPILE) $< -o $@
clean:
-rm -rf $(BUILD_CACHE_DIR)
查看so文件中导出函数的指令
nm -D 7z.so
objdump -tT 7z.so
导出指定的函数的方法是使用:__attribute__((visibility("default")))
不打算导出的方法使用__attribute__((visibility("hidden")))
在链接程序的时候使用-fvisibility=hidden
http://liulixiaoyao.blog.51cto.com/1361095/814329 此blog有更加详细的介绍