使用Android-NDK(Clang)构建基于C的项目时,返回类型错误

我正在尝试为Android构建 CHOLMOD库suitesparse的一部分)。该库使用基于Makefile的构建系统,我正在尝试使用CMake。

现在t_cholmod_triplet.c是库的一部分,并通过以下方式定义函数:

#include "cholmod_template.h"
#include "cholmod_core.h"
#include "cholmod_internal.h"

static size_t TEMPLATE (cholmod_triplet_to_sparse)
(
    /* ---- input ---- */
    cholmod_triplet *T,/* matrix to copy */
    /* ---- in/out --- */
    cholmod_sparse *R,/* output matrix */
    /* --------------- */
    cholmod_common *Common
)
{
    double *Rx,*Rz,*Tx,*Tz ;
    Int *Wj,*Rp,*Ri,*Rnz,*Ti,*Tj  ;
    Int i,j,p,p1,p2,pdest,pj,k,stype,nrow,ncol,nz ;
    size_t anz ;
    ...
    ... Computations
    ... 
    return (anz)
}

当我尝试构建时,clang抱怨以下内容:

error: function cannot return function type 'size_t (cholmod_triplet *,cholmod_sparse *,cholmod_common *)' (aka 'unsigned int (struct cholmod_triplet_struct *,struct cholmod_sparse_struct *,struct cholmod_common_struct *)')

从上述函数的最后一行开始,它返回类型size_t。但是Clang认为它正在返回一个函数(错误描述)。这是什么原因呢?哪些最小的更改可以纠正此错误?

Edit-1

完成干净的项目并重建后,现在我遇到了t_cholmod_dense.c link to file

的错误

错误足迹相似,返回类型被错误地识别:

error: function cannot return function type 'cholmod_dense *(cholmod_sparse *,cholmod_common *)' (aka 'struct cholmod_dense_struct *(struct cholmod_sparse_struct *,struct cholmod_common_struct *)')

Edit-2

#include "cholmod_core.h"
#include "cholmod_internal.h"
#include "cholmod_template.h"

static void TEMPLATE (change_simplicial_numeric)
(
    cholmod_factor *L,Int to_ll,Int to_packed,Int *newLi,double *newLx,double *newLz,Int lnz,Int grow,double grow1,Int grow2,Int make_ll,Int make_monotonic,Int make_ldl,cholmod_common *Common
)
{

引发以下错误:

app/src/main/cpp/include/CHOLMOD/Core/t_cholmod_change_factor.c:23:22: error: function cannot return function type 'void (cholmod_factor *,int,int *,double *,double,cholmod_common *)' (aka 'void (struct cholmod_factor_struct *,struct cholmod_common_struct *)')
hank112 回答:使用Android-NDK(Clang)构建基于C的项目时,返回类型错误

我对该程序包一无所知,但是很明显,有些宏内容没有正确处理。

在您提到的#include文件中可以找到TEMPLATE()宏,并且有很长的#ifdef序列将其转换为其他一些相关的宏,这些宏试图使用前缀重命名该函数:

R_TEMPLATE(myfunction) --> r_myfunction
P_TEMPLATE(myfunction) --> p_myfunction
CT_TEMPLATE(myfunction) --> ct_myfunction
C_TEMPLATE(myfunction)  --> c_myfunction
ZT_TEMPLATE(myfunction) --> zt_myfunction
Z_TEMPLATE(myfunction)  --> z_myfunction

这些第二级宏似乎是在include/cholmod_complexity.h中定义的,而include/cholmod_internal.h中又包含了这些宏。

编辑:您刚刚更新了问题,并且解释了所有内容。

#include "cholmod_template.h"  // move me last
#include "cholmod_core.h"
#include "cholmod_internal.h"

模板部分需要位于内部之后,因此请将其移至cholmod_internal.h包含文件之后。然后,当模板宏调用R_TEMPLATE或其他任何内容时,它们会在cholmod_internal.h

中找到这些定义。 ,

看第二个例子,很明显它是相关的。错误是:

app/.../Core/t_cholmod_change_factor.c:23:22: error: function cannot return function type 

'void (cholmod_factor *,int,int *,double *,double,cholmod_common *)' 

(我删除了错误的“ aka”部分。这基本上是函数定义,但删除了名称:

void NAMEGOESHERE (cholmod_factor *,... );

因此显然无法编译。

makefile是否使用相同的编译器标记/宏定义来构建所有文件?可能是通过各种#include文件的路径以某种方式未能定义TEMPLATE宏,因此编译器看不到函数名。

思路:将其添加到您的#include之后但函数之前:

#ifndef TEMPLATE
#  error "We don't have a TEMPLATE macro - why is that?"
#endif

这样,如果由于某种原因而缺少宏,它可以让您直接知道而不是通过神秘而无益的编译器警告来了解。

本文链接:https://www.f2er.com/3033324.html

大家都在问