EXPORT_FUNCTION 通常用于在共享库(如 .so 文件)中导出函数,使得这些函数可以在其他程序中被调用。在 C 和 C++ 中,导出函数的方法因平台和编译器而异。以下是一些常见的方法:
在 Linux 上使用 __attribute __((visibility(“default”)))
在 Linux 平台上,可以使用 GCC 的 __attribute __((visibility(“default”))) 来导出函数。默认情况下,GCC 使用隐藏的符号可见性,这意味着只有显式标记为 default 的函数才会被导出。
// 导出函数
__attribute__((visibility("default")))
void my_exported_function() {
// 函数实现
}
// 或者在头文件中定义宏
#define EXPORTED __attribute__((visibility("default")))
EXPORTED void another_exported_function() {
// 函数实现
}
在 Windows 上使用 __declspec(dllexport)
在 Windows 平台上,可以使用 __declspec __(dllexport) 来导出函数。为了方便管理,通常会定义一个宏来处理导出和导入。
// 定义宏
#ifdef MYLIBRARY_EXPORTS
#define MYLIBRARY_API __declspec(dllexport)
#else
#define MYLIBRARY_API __declspec(dllimport)
#endif
// 导出函数
MYLIBRARY_API void my_exported_function() {
// 函数实现
}
在 Android NDK 中导出函数
在 Android NDK 中,通常使用 __attribute __((visibility(“default”))) 来导出函数。你也可以在 Android.mk 或 CMakeLists.txt 中指定导出符号。
// 导出函数
__attribute__((visibility("default")))
void my_exported_function() {
// 函数实现
}
在 Android.mk 中指定导出符号
在 Android.mk 文件中,你可以使用 LOCAL_EXPORT_C_INCLUDES 和 LOCAL_EXPORT_LDLIBS 来指定导出的头文件和库。
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := mylibrary
LOCAL_SRC_FILES := mylibrary.c
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
# 导出所有符号
LOCAL_CFLAGS := -fvisibility=hidden
LOCAL_CFLAGS += -DANDROID_EXPORT=__attribute__((visibility(\"default\")))
include $(BUILD_SHARED_LIBRARY)
在 CMakeLists.txt 中指定导出符号
在 CMakeLists.txt 文件中,你可以使用 add_library 和 target_compile_options 来指定导出符号。
cmake_minimum_required(VERSION 3.4.1)
# 添加库
add_library(mylibrary SHARED mylibrary.c)
# 设置编译选项
target_compile_options(mylibrary PRIVATE -fvisibility=hidden)
target_compile_definitions(mylibrary PRIVATE ANDROID_EXPORT="__attribute__((visibility(\"default\")))")
# 导出头文件
target_include_directories(mylibrary PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
示例代码
假设你有一个简单的库 libagmmixer.so,并且你想导出一些函数。以下是示例代码:
头文件 agmmixer.h
#ifndef AGMMIXER_H
#define AGMMIXER_H
#ifdef __cplusplus
extern "C" {
#endif
// 导出宏
#if defined(__GNUC__) || defined(__clang__)
#define AGM_EXPORT __attribute__((visibility("default")))
#elif defined(_MSC_VER)
#define AGM_EXPORT __declspec(dllexport)
#else
#define AGM_EXPORT
#endif
// 导出函数声明
AGM_EXPORT struct mixer* mixer_open(unsigned int card);
AGM_EXPORT void mixer_close(struct mixer *mixer);
// 其他函数声明...
#ifdef __cplusplus
}
#endif
#endif // AGMMIXER_H
源文件 agmmixer.c
#include "agmmixer.h"
#include <stdio.h>
// 实现导出函数
struct mixer* mixer_open(unsigned int card) {
// 打开混音器的实现
printf("Opening mixer for card %u\n", card);
return (struct mixer*)malloc(sizeof(struct mixer));
}
void mixer_close(struct mixer *mixer) {
// 关闭混音器的实现
if (mixer) {
free(mixer);
printf("Closing mixer\n");
}
}
// ......
65

被折叠的 条评论
为什么被折叠?



