CMake 目标属性 DEFINE_SYMBOL

一 set_target_properties

Targets can have properties that affect how they are built.

  • 目标可能具有影响其构建方式的属性。

  • 语法

    set_target_properties(target1 target2 ...
                          PROPERTIES prop1 value1
                          prop2 value2 ...)
    

Sets properties on targets. The syntax for the command is to list all the targets you want to change, and then provide the values you want to set next. You can use any prop value pair you want and extract it later with the get_property() or get_target_property() command.

  • 在目标上设置属性。命令的语法是列出您想要更改的所有目标,然后提供您接下来要设置的值。您可以使用任何您想要的属性值对,并在以后使用get_property() 或get_target_property()命令提取。

See also the set_property(TARGET) command. See Properties on Targets
for the list of properties known to CMake.

  • 另请参阅set_property(TARGET)命令。
  • 有关 CMake 已知属性列表,请参阅Properties on Targets
二 DEFINE_SYMBOL

Define a symbol when compiling this target’s sources.
DEFINE_SYMBOL sets the name of the preprocessor symbol defined when compiling sources in a shared library. If not set here then it is set to target_EXPORTS by default (with some substitutions if the target is not a valid C identifier). This is useful for headers to know whether they are being included from inside their library or outside to properly setup dllexport/dllimport decorations.

  • 在编译目标源文件时定义符号。
  • DEFINE_SYMBOL设置在共享库中编译源源文件时定义的预处理器符号的名称。如果不设置在此处,则默认情况下将其设置为target_EXPORTS(如果目标不是有效的 C 标识符,则有一些替换)。这是对头文件知道它们是从它们的库内部或外部被包含,以正确设置dllexport/dllimport装饰。
三 举例
  • 对于第三方库jsoncpp的 json/config.h 有如下代码:

    ...
    #ifdef JSON_IN_CPPTL
    #define JSON_API CPPTL_API
    #elif defined(JSON_DLL_BUILD)
    #if defined(_MSC_VER) || defined(__MINGW32__)
    #define JSON_API __declspec(dllexport)
    #define JSONCPP_DISABLE_DLL_INTERFACE_WARNING
    #endif // if defined(_MSC_VER)
    #elif defined(JSON_DLL)
    #if defined(_MSC_VER) || defined(__MINGW32__)
    #define JSON_API __declspec(dllimport)
    #define JSONCPP_DISABLE_DLL_INTERFACE_WARNING
    #endif // if defined(_MSC_VER)
    #endif // ifdef JSON_IN_CPPTL
    #if !defined(JSON_API)
    #define JSON_API
    #endif
    ...
    
  • 所以,如果要编译动态库,需要在CMakeLists.txt 中加入以下语句:

    set_target_properties(jsoncpp PROPERTIES DEFINE_SYMBOL JSON_DLL_BUILD)
    
四 参考
C/C++: ld: error: undefined symbol: sunchip_face_init #ifndef RKNN_SUNCHIP_H #define RKNN_SUNCHIP_H #ifdef __cplusplus extern "C" { #endif // 初始化模型 API_EXPORT int sunchip_face_init(); // 执行推理 //char* run_yolov8_pose(unsigned char* pixeldata,int cound); // 清理工作 API_EXPORT void sunchip_face_cleanup(); #ifdef __cplusplus } #endif #endif // RKNN_SUNCHIP_H #include "rknn_sunchip.h" int sunchip_face_init() { return 10; } void sunchip_face_cleanup(){ }; cmake_minimum_required(VERSION 3.4.1) project(RKFace VERSION 1.0.0) # 定义共享库 sunchip_rknn add_library(sunchip_rknn SHARED src/rknn_sunchip.c ) # 设置符号可见性控制 target_compile_options(sunchip_rknn PRIVATE -fvisibility=hidden # 隐藏所有符号 -fno-builtin # 防止内置符号冲突 ) # 定义导出宏 target_compile_definitions(sunchip_rknn PRIVATE -DAPI_EXPORT=__attribute__\(\(visibility\(\"default\"\)\)\) ) # 添加链接器选项 target_link_options(sunchip_rknn PRIVATE "-Wl,--exclude-libs=ALL" # 隐藏依赖库符号 "-Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/version_script.map" ) # 设置 C++ 标准 set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 基本编译选项 set(CMAKE_C_FLAGS "-Wall -fPIC -O2") set(CMAKE_CXX_FLAGS "-Wall -fPIC -O2") # Android 平台配置 if(CMAKE_SYSTEM_NAME STREQUAL "Android") add_definitions(-DANDROID) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++") endif() # 包含目录 include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/include /src/rknn_sunchip.h ) # 源文件 set(main_source src/cmain.cc) # 库文件路径 set(LIBPATH ${CMAKE_CURRENT_SOURCE_DIR}/libs/android) # 链接库 set(LINKS ${LIBPATH}/libRKFace.so ${LIBPATH}/libnva.so ${LIBPATH}/librknnrt.so ) # Android 特定库 if(CMAKE_SYSTEM_NAME STREQUAL "Android") list(APPEND LINKS log c++_shared) endif() # 标准库 list(APPEND LINKS c m dl) # 生成可执行文件 add_executable(rkface.demo ${main_source}) # 链接库 target_link_libraries(rkface.demo ${LINKS}) # 设置安装目录为当前目录下的 install set(CMAKE_INSTALL_PREFIX ${CMAKE_CURRENT_SOURCE_DIR}/install) # 安装可执行文件到 install/bin install(TARGETS rkface.demo RUNTIME DESTINATION bin) # 安装库文件到 install/lib install(FILES ${LIBPATH}/libRKFace.so ${LIBPATH}/libnva.so ${LIBPATH}/librknnrt.so DESTINATION lib ) # 安装头文件到 install/include (如果需要) install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/ DESTINATION include FILES_MATCHING PATTERN "*.h" PATTERN "*.hpp" ) # 安装共享库 install(TARGETS sunchip_rknn RUNTIME DESTINATION lib) { global: rknn_*; # 只导出 rknn_ 前缀的符号 JNI_OnLoad; # 导出必要的 JNI 入口 local: *; # 隐藏所有其他符号 }; 我根据配置文件打包出来文件,在android studio使用找不到接口
最新发布
06-14
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值