今天,当我们包装传感器插件时,出现了一个问题。将包使用cmake编译生成的方法.so文件的时候出错,collect2: error: ld return xxx undefined reference,说明函数A没有定义。实际上该函数A是在一个a.c同时定义和实现a.h声明函数A。函数A是在b.cpp同时在中调用b.h中include了a.h。
解决这个问题有两种方法:
1. 将a.c改成a.cpp
首先尝试将a.c改成了a.cpp,编译后又报错,显示flock::flock(int &,int)没有定义,所以我去找相应的头文件,一个是sys/fcntl.h。改完发现还是有错的。所以继续检查,发现C 中要使用sys/file.h这个头文件可以。所以这个头文件介绍后编译正常。
2. 在b.h中引用extern "c"引入c文件对应的头文件
不改变原始代码,直接修改b.h将#include "a.h"改成
extern "c"
{
#include "a.h"
}
通过直接编译。
通过上述过程,我们发现。我们不能直接在那里cpp文件中使用.c必须使用文件中定义的函数extern "c"引入它的目的是告诉编译器a.c使用C编译器而不是C编译器c 编译器。与此同时,它还告诉编译器环境中找到头文件,而不是c 环境中的头文件。
上述过程也表明,在linux下,c和c 环境中有许多函数是同名的,但参数可能不同,它们的位置也不同。我们必须检查具体引用哪一个。flock(int ,int)在c 中是定义在sys/file.hC中可以定义sys/fcntl.h中的。