Makefile转CMake交叉编译时无法找到libOBD2.so共享链接库
问题原因
- 头文件配置语法错误
include_directories是全局生效的配置函数,不接受目标名、访问权限参数,你写的include_directories(${PROJECT_NAME} PRIVATE ${PATH1})会把iwtest、PRIVATE都当成头文件路径添加到编译参数,生成无效的-I配置,目标级的头文件配置应该用target_include_directories。 - 链接路径变量引用错误
CMake的变量引用语法是${变量名},你在target_link_options里用了Makefile语法的-L$(PATH3),导致PATH3变量没有被解析,链接器找不到指定的系统库路径。 - 链接顺序和重复配置错误
你已经通过add_library导入了libOBD2.so的完整路径,不需要再额外加-lOBD2参数;同时你把所有-l链接参数放在了目标文件前面,链接器处理-l参数时还未读取到目标文件的符号依赖,会直接跳过库加载,导致找不到符号。 - 编译参数配置错误
add_definitions用于添加预处理宏,不应该用来传递编译/链接参数,-s是链接阶段的strip参数,放在编译配置里无效。
修正后的CMakeLists.txt
cmake_minimum_required(VERSION 3.5) set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR ARM) # 开启fPIC set(CMAKE_POSITION_INDEPENDENT_CODE ON) # 配置编译选项 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O0") # 配置链接选项 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s") project(iwtest) set(PATH1 "/opt/fsl-imx-x11/5.4-zeus/sysroots/x86_64-pokysdk-linux/usr/include/") set(PATH2 "/opt/fsl-imx-x11/5.4-zeus/sysroots/x86_64-pokysdk-linux/usr/include/libxml2/") set(PATH3 "/opt/fsl-imx-x11/5.4-zeus/sysroots/cortexa7t2hf-neon-poky-linux-gnueabi/usr/lib") set(LIB_DIR "${CMAKE_SOURCE_DIR}/lib") set(SOURCE_FILES src/test.c) add_executable(${PROJECT_NAME} ${SOURCE_FILES}) # 配置目标头文件路径 target_include_directories(${PROJECT_NAME} PRIVATE ${PATH1} ${PATH2} ${PROJECT_SOURCE_DIR}/include ) # 导入自定义libOBD2共享库 add_library(libOBD2 SHARED IMPORTED) set_target_properties(libOBD2 PROPERTIES IMPORTED_LOCATION ${LIB_DIR}/libOBD2.so INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_SOURCE_DIR}/include ) # 添加系统库搜索路径 target_link_directories(${PROJECT_NAME} PRIVATE ${PATH3}) # 配置链接依赖 target_link_libraries(${PROJECT_NAME} PRIVATE libOBD2 z ssl crypto curl xml2 m dl pthread rt )
使用说明
清空之前的build目录,重新执行cmake、make命令即可正常编译。
内容的提问来源于stack exchange,提问作者heych
相关产品推荐
相关产品推荐

