基于PCANBasic构建CANInterface库后,测试程序出现未定义引用错误
问题描述
我基于PCANBasic创建了CANInterface静态库,通过CMake构建该库过程无异常,但使用以下g++命令编译调用libCANInterface.a的测试程序时,出现CAN_Initialize等PCANBasic相关函数的未定义引用错误:
g++ -o Testing Testing.cpp -L/home/gary/Desktop/VSCode/Testing -lCANInterface
相关代码如下:
生成libCANInterface.a的CMakeLists.txt
cmake_minimum_required(VERSION 3.10) project(CANInterface) add_library(CANInterface CANInterface.cpp) find_library(lib_path pcanbasic) target_link_libraries(CANInterface "${lib_path}") find_path(header_path CANInterface) target_include_directories(CANInterface PUBLIC "${header_path}")
CANInterface.cpp关键代码片段
#include "PCANBasic.h" ... void CAN::InitPCAN() { // 初始化PCAN-USB通道 result = CAN_Initialize(PCAN_USBBUS1, PCAN_BAUD_500K); if (result != PCAN_ERROR_OK) { CAN_GetErrorText(result, 0, strMsg); printf("strMsg %s \n", strMsg); } else { printf("PCAN-USB was initialized \n"); bInitialized = true; } }
Testing.cpp测试代码
#include <iostream> #include "CANInterface.h" int main() { vehicle vVehicle; vVehicle.read(); return 0; }
问题原因
静态库(.a格式)只是目标文件的归档集合,不会自动打包它所依赖的其他库的代码。你的libCANInterface.a依赖pcanbasic库,但编译测试程序时仅链接了libCANInterface.a,未链接底层的pcanbasic,导致编译器无法找到CAN_Initialize等函数的具体实现。
解决方案
有两种可行的解决方式:
方式1:手动在编译命令中补充依赖库
在g++命令末尾添加-lpcanbasic,同时注意库的链接顺序(依赖其他库的库要放在被依赖库前面):
g++ -o Testing Testing.cpp -L/home/gary/Desktop/VSCode/Testing -lCANInterface -lpcanbasic
方式2:用CMake管理测试程序(更推荐)
既然已经用CMake构建CANInterface库,建议统一用CMake管理测试程序,它会自动处理依赖传递。创建测试程序的CMakeLists.txt:
cmake_minimum_required(VERSION 3.10) project(Testing) # 指定CANInterface库的路径 find_library(CANINTERFACE_LIB CANInterface PATHS /home/gary/Desktop/VSCode/Testing) # 查找pcanbasic库(若系统能自动识别可省略此步) find_library(PCANBASIC_LIB pcanbasic) add_executable(Testing Testing.cpp) # 链接CANInterface及其依赖的pcanbasic库 target_link_libraries(Testing ${CANINTERFACE_LIB} ${PCANBASIC_LIB}) # 添加CANInterface的头文件路径 target_include_directories(Testing PUBLIC /home/gary/Desktop/VSCode/Testing)
执行以下命令构建测试程序:
mkdir build && cd build cmake .. make
内容的提问来源于stack exchange,提问作者Nina
相关产品推荐
相关产品推荐

