Runtime 中的 _cmd、 IMP

本文详细介绍了Objective-C中IMP的概念,即指向实际执行函数体的函数指针,并解释了method结构体,它用于指向Objective-C中的方法。此外,还探讨了_cmd变量及实例变量Ivar的使用。

IMP

IMP-指向实际执行函数体的函数指针

#if !OBJC_OLD_DISPATCH_PROTOTYPES
typedef void (*IMP)(void /* id, SEL, ... */ ); 
#else
typedef id (*IMP)(id, SEL, ...); 
#endif

可以看到,这个函数体前两个参数是 id(消息接受者,也就是对象),以及SEL(方法的名字)


method/objc_method

method - 指向Objective C中的方法的指针

typedef struct objc_method *Method;

其中

struct objc_method {
    SEL method_name                                          OBJC2_UNAVAILABLE;
    char *method_types                                       OBJC2_UNAVAILABLE;
    IMP method_imp                                           OBJC2_UNAVAILABLE;
}                                                            OBJC2_UNAVAILABLE;

 


_cmd

SEL 类型的一个变量,Objective C的函数的前两个隐藏参数为self 和 _cmd


Ivar

ivar - objective C中的实例变量

typedef struct objc_ivar *Ivar;

 

可以看到变量的内存模型

struct objc_ivar {
    char *ivar_name                                          OBJC2_UNAVAILABLE;
    char *ivar_type                                          OBJC2_UNAVAILABLE;
    int ivar_offset                                          OBJC2_UNAVAILABLE;
#ifdef __LP64__
    int space                                                OBJC2_UNAVAILABLE;
#endif
}                                                            OBJC2_UNAVAILABLE;

 

转载于:https://www.cnblogs.com/junhuawang/p/5760467.html

修改后 cmake_minimum_required(VERSION 3.31) project(amqp_c_sdk LANGUAGES C) set(CMAKE_C_STANDARD 11) # 设定构建运行路径,避免污染根目录 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/.archive) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/.library) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/.runtime) set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/.runtime) set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/.library) ## 查找并导入库 #find_package(CURL CONFIG REQUIRED) #find_package(rabbitmq-c CONFIG REQUIRED) #find_package(json-c CONFIG REQUIRED) # 查找并导入库 find_package(CURL CONFIG REQUIRED) find_package(rabbitmq-c CONFIG REQUIRED) find_package(json-c CONFIG REQUIRED) find_package(OpenSSL REQUIRED) include_directories(${PROJECT_SOURCE_DIR}/src) include_directories(${CURL_INCLUDE_DIRS}) include_directories(${RABBITMQ-C_INCLUDE_DIRS}) include_directories(${JSONC_INCLUDE_DIRS}) include_directories(${OPENSSL_INCLUDE_DIR}) # 收集所有源文件 file(GLOB_RECURSE SOURCES "src/*.c") # 添加一个可执行文件,包含所有源文件 add_executable(amqp_c_sdk ${SOURCES}) ## 遍历项目src目录下所有的 .c 文件,自动添加 #file(GLOB_RECURSE files src/**.c src/**.cpp) #foreach (file ${files}) # 遍历所有发现的文件 # get_filename_component(name ${file} NAME) # 获取文件名 ## add_library(${name} SHARED ${file}) # 添加可执行文件 # add_executable(${name} ${file}) # 添加可执行文件 #endforeach () # 遍历结束 # 链接库 #target_link_libraries(${name}) # 链接库 target_link_libraries(amqp_c_sdk PRIVATE ${JSON_C_LIBRARIES} ${RABBITMQ_C_LIBRARIES} ${CURL_LIBRARIES} OpenSSL::SSL OpenSSL::Crypto rpcrt4 ) 程序运行日志 ====================[ 构建 | amqp_c_sdk | Debug-Visual Studio ]=================== "D:\Program Files\JetBrains\CLion 2025.1.3\bin\cmake\win\x64\bin\cmake.exe" --build D:\work\code\CLionProjects\amqp-c-sdk\cmake-build-debug-visual-studio --target amqp_c_sdk -j 14 [1/5] Building C object CMakeFiles\amqp_c_sdk.dir\src\main.c.obj warning: amqp.h is deprecated, use rabbitmq-c/amqp.h instead. warning: amqp_tcp_socket.h is deprecated, use rabbitmq-c/tcp_socket.h instead. [2/5] Building C object CMakeFiles\amqp_c_sdk.dir\src\sdk_init_info_vo.c.obj [3/5] Building C object CMakeFiles\amqp_c_sdk.dir\src\sdk_init_info_dto.c.obj [4/5] Building C object CMakeFiles\amqp_c_sdk.dir\src\http.c.obj [5/5] Linking C executable D:\work\code\CLionProjects\amqp-c-sdk\.runtime\amqp_c_sdk.exe FAILED: D:/work/code/CLionProjects/amqp-c-sdk/.runtime/amqp_c_sdk.exe C:\WINDOWS\system32\cmd.exe /C "cd . && "D:\Program Files\JetBrains\CLion 2025.1.3\bin\cmake\win\x64\bin\cmake.exe" -E vs_link_exe --msvc-ver=1944 --intdir=CMakeFiles\amqp_c_sdk.dir --rc=D:\WINDOW~1\10\bin\100261~1.0\x64\rc.exe --mt=D:\WINDOW~1\10\bin\100261~1.0\x64\mt.exe --manifests -- D:\PROGRA~2\MICROS~1\2022\COMMUN~1\VC\Tools\MSVC\1444~1.352\bin\Hostx64\x64\link.exe /nologo CMakeFiles\amqp_c_sdk.dir\src\http.c.obj CMakeFiles\amqp_c_sdk.dir\src\main.c.obj CMakeFiles\amqp_c_sdk.dir\src\rabbitmq.c.obj CMakeFiles\amqp_c_sdk.dir\src\sdk_init_info_dto.c.obj CMakeFiles\amqp_c_sdk.dir\src\sdk_init_info_vo.c.obj CMakeFiles\amqp_c_sdk.dir\src\signature_utils.c.obj CMakeFiles\amqp_c_sdk.dir\src\url_utils.c.obj /out:D:\work\code\CLionProjects\amqp-c-sdk\.runtime\amqp_c_sdk.exe /implib:D:\work\code\CLionProjects\amqp-c-sdk\.archive\amqp_c_sdk.lib /pdb:D:\work\code\CLionProjects\amqp-c-sdk\.runtime\amqp_c_sdk.pdb /version:0.0 /machine:x64 /debug /INCREMENTAL /subsystem:console D:\work\soft\clion\.vcpkg-clion\vcpkg\installed\x64-windows\debug\lib\libcurl-d.lib D:\work\soft\clion\.vcpkg-clion\vcpkg\installed\x64-windows\debug\lib\libssl.lib D:\work\soft\clion\.vcpkg-clion\vcpkg\installed\x64-windows\debug\lib\libcrypto.lib rpcrt4.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib && C:\WINDOWS\system32\cmd.exe /C "cd /D D:\work\code\CLionProjects\amqp-c-sdk\cmake-build-debug-visual-studio && C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -noprofile -executionpolicy Bypass -file D:/work/soft/clion/.vcpkg-clion/vcpkg/scripts/buildsystems/msbuild/applocal.ps1 -targetBinary D:/work/code/CLionProjects/amqp-c-sdk/.runtime/amqp_c_sdk.exe -installedDir D:/work/soft/clion/.vcpkg-clion/vcpkg/installed/x64-windows/debug/bin -OutVariable out"" LINK Pass 1: command "D:\PROGRA~2\MICROS~1\2022\COMMUN~1\VC\Tools\MSVC\1444~1.352\bin\Hostx64\x64\link.exe /nologo CMakeFiles\amqp_c_sdk.dir\src\http.c.obj CMakeFiles\amqp_c_sdk.dir\src\main.c.obj CMakeFiles\amqp_c_sdk.dir\src\rabbitmq.c.obj CMakeFiles\amqp_c_sdk.dir\src\sdk_init_info_dto.c.obj CMakeFiles\amqp_c_sdk.dir\src\sdk_init_info_vo.c.obj CMakeFiles\amqp_c_sdk.dir\src\signature_utils.c.obj CMakeFiles\amqp_c_sdk.dir\src\url_utils.c.obj /out:D:\work\code\CLionProjects\amqp-c-sdk\.runtime\amqp_c_sdk.exe /implib:D:\work\code\CLionProjects\amqp-c-sdk\.archive\amqp_c_sdk.lib /pdb:D:\work\code\CLionProjects\amqp-c-sdk\.runtime\amqp_c_sdk.pdb /version:0.0 /machine:x64 /debug /INCREMENTAL /subsystem:console D:\work\soft\clion\.vcpkg-clion\vcpkg\installed\x64-windows\debug\lib\libcurl-d.lib D:\work\soft\clion\.vcpkg-clion\vcpkg\installed\x64-windows\debug\lib\libssl.lib D:\work\soft\clion\.vcpkg-clion\vcpkg\installed\x64-windows\debug\lib\libcrypto.lib rpcrt4.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib /MANIFEST /MANIFESTFILE:CMakeFiles\amqp_c_sdk.dir/intermediate.manifest CMakeFiles\amqp_c_sdk.dir/manifest.res" failed (exit code 1120) with the following output: http.c.obj : error LNK2019: 无法解析的外部符号 json_object_put,函数 parse_json_response 中引用了该符号 http.c.obj : error LNK2019: 无法解析的外部符号 json_object_object_get,函数 parse_json_response 中引用了该符号 http.c.obj : error LNK2019: 无法解析的外部符号 json_object_get_int,函数 parse_json_response 中引用了该符号 http.c.obj : error LNK2019: 无法解析的外部符号 json_object_get_string,函数 parse_json_response 中引用了该符号 http.c.obj : error LNK2019: 无法解析的外部符号 json_tokener_parse,函数 parse_json_response 中引用了该符号 rabbitmq.c.obj : error LNK2019: 无法解析的外部符号 __imp_amqp_channel_open,函数 rabbitmq_connect 中引用了该符号 rabbitmq.c.obj : error LNK2019: 无法解析的外部符号 __imp_amqp_basic_consume,函数 rabbitmq_basic_consume 中引用了该符号 rabbitmq.c.obj : error LNK2019: 无法解析的外部符号 __imp_amqp_cstring_bytes,函数 rabbitmq_basic_consume 中引用了该符号 rabbitmq.c.obj : error LNK2019: 无法解析的外部符号 __imp_amqp_new_connection,函数 rabbitmq_connect 中引用了该符号 rabbitmq.c.obj : error LNK2019: 无法解析的外部符号 __imp_amqp_destroy_connection,函数 rabbitmq_close 中引用了该符号 rabbitmq.c.obj : error LNK2019: 无法解析的外部符号 __imp_amqp_maybe_release_buffers,函数 rabbitmq_basic_consume 中引用了该符号 rabbitmq.c.obj : error LNK2019: 无法解析的外部符号 __imp_amqp_get_rpc_reply,函数 rabbitmq_connect 中引用了该符号 rabbitmq.c.obj : error LNK2019: 无法解析的外部符号 __imp_amqp_login,函数 rabbitmq_connect 中引用了该符号 rabbitmq.c.obj : error LNK2019: 无法解析的外部符号 __imp_amqp_connection_close,函数 rabbitmq_close 中引用了该符号 rabbitmq.c.obj : error LNK2019: 无法解析的外部符号 __imp_amqp_basic_ack,函数 rabbitmq_basic_consume 中引用了该符号 rabbitmq.c.obj : error LNK2019: 无法解析的外部符号 __imp_amqp_consume_message,函数 rabbitmq_basic_consume 中引用了该符号 rabbitmq.c.obj : error LNK2019: 无法解析的外部符号 __imp_amqp_destroy_envelope,函数 rabbitmq_basic_consume 中引用了该符号 rabbitmq.c.obj : error LNK2019: 无法解析的外部符号 __imp_amqp_socket_open,函数 rabbitmq_connect 中引用了该符号 rabbitmq.c.obj : error LNK2019: 无法解析的外部符号 __imp_amqp_tcp_socket_new,函数 rabbitmq_connect 中引用了该符号 rabbitmq.c.obj : error LNK2019: 无法解析的外部符号 __imp_amqp_empty_bytes,函数 rabbitmq_basic_consume 中引用了该符号 rabbitmq.c.obj : error LNK2019: 无法解析的外部符号 __imp_amqp_empty_table,函数 rabbitmq_basic_consume 中引用了该符号 D:\work\code\CLionProjects\amqp-c-sdk\.runtime\amqp_c_sdk.exe : fatal error LNK1120: 21 个无法解析的外部命令 ninja: build stopped: subcommand failed. 还是存在部分LINK2019,怎么解决
07-24
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值