如何在CMakeLists中链接自定义静态库 CLion Capstone项目构建求助
问题排查与配置方案
1. 头文件需求说明
三个架构相关的.c文件不需要单独补充对应头文件,但是因为涉及C与C混编,需要在调用这三个C函数的cstool.cpp顶部补充extern "C"声明,避免C编译时修改函数符号导致链接失败,声明格式参考:
extern "C" { // 请把括号内的参数替换为三个函数的实际参数列表 void print_insn_detail_arm(/* 参数列表 */); void print_insn_detail_arm64(/* 参数列表 */); void print_insn_detail_x86(/* 参数列表 */); }
如果需要更规范的项目结构,也可以把上述声明单独放到cstool_arch.h头文件中,再在cstool.cpp中引入该头文件即可。
2. 正确CMake配置示例
以下是根目录CMakeLists.txt的参考写法,按实际路径调整即可:
# 声明最低支持的CMake版本,可根据你的CLion默认版本调整 cmake_minimum_required(VERSION 3.16) # 必须同时声明C和CXX两种语言,否则.c文件不会被正确编译 project(capstone_demo C CXX) # 声明C/C++标准,按需调整版本 set(CMAKE_CXX_STANDARD 17) set(CMAKE_C_STANDARD 11) # 查找Capstone依赖,若Capstone为自定义路径安装,可补充PATHS参数指定安装路径 find_package(Capstone REQUIRED) # 将三个架构C文件编译为你提到的libcstool_arch.a静态库 add_library(cstool_arch STATIC cstool_arm.c cstool_arm64.c cstool_x86.c ) # 给静态库添加Capstone头文件搜索路径 target_include_directories(cstool_arch PRIVATE ${Capstone_INCLUDE_DIRS}) # 编译核心业务代码为可执行文件 add_executable(${PROJECT_NAME} main.cpp cstool.cpp ) # 添加项目自身头文件搜索路径,保证能找到cstool.h target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) # 链接依赖,注意顺序:依赖方在前,被依赖方在后 target_link_libraries(${PROJECT_NAME} PRIVATE cstool_arch ${Capstone_LIBRARIES} )
3. 常见配置疏漏排查
- 不要遗漏
extern "C"声明,这是C/C++混编链接失败的高频原因 target_link_libraries的链接顺序不能颠倒,上层依赖需要放在被依赖项的前面- 如果Capstone是自定义路径编译安装的,需要在
find_package前加set(Capstone_ROOT /path/to/capstone/install)指定安装路径
内容的提问来源于stack exchange,提问作者mxw
相关产品推荐
相关产品推荐

