不信难不倒你

时间:2022-10-12 18:54:13
在Android下
  定义模板函数、运算符重载、静态变量 和 形参默认值   
与在c/c++中定义的区别在哪里?为什么?

   在linux下能编译运行的一段代码 

   拿到android上,make下就报错了..........

9 个解决方案

#1


不知道 现在应用层都没搞定 搞定应用层了 在研究ndk去  

#2


你要贴出来报的什么错误呀

#3


应该ndk了吧

#4


在linux下能编译运行的一段代码  

  拿到android上,make下就报错了..........                                  



你这样问,肯定难倒大家了。。详细点吧。

#5


LZ是为了难道我们还是为了解决问题?

#6


 

#include <stdio.h>

template <class T>
void print_size(T t,int a=6)
{
printf("t = %d\t a = %d\n",sizeof(T),a);
}

typedef struct myint{
int a;
int b;
}mint;

int  operator==(mint a,mint b)
{
if( a.a == b.a && a.b == b.b )
return 1;
return 0;
}

int main()
{
mint m,n;
char s1[10] = "movie";
char s2[10] = "hello";
m.a = n.a = 4;
m.b = n.b = 7;

print_size(5);
print_size('c',5);

if(m==n) print_size(m);


return 0 ;
}

#7


那个问题貌似解决了,原来是因为我的文件名是.c的,Android默认用gcc编译,所以就报错了

汗~~~~~~~~~~~~
我又有另外个问题,
就是编译生成的.o文件,想生成库文件,报错如下
target SharedLib: libos (out/target/product/generic/obj/SHARED_LIBRARIES/libos_intermediates/LINKED/libos.so)
prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/../lib/gcc/arm-eabi/4.4.3/../../../../arm-eabi/bin/ld: out/target/product/generic/obj/SHARED_LIBRARIES/libos_intermediates/src/thread.o: in function bridge(thread*, thread_type_e):external/vgx/libos/src/thread.cpp:25:  error: undefined reference to 'create_posix_thread(char const*, unsigned long, unsigned long, void* (*)(void*), void*, unsigned long)'
这个函数我明明已经包含在头文件中了。
各位大大帮忙指点下....

#8


炫耀吧

#9


如果是.c文件,用下面的方法解决:
#ifdef __cplusplus
extern "C" {
#include <utils/CallStack.h>
}
#endif

类似这样就好了

参考:
问题
编译NDK程序,提示错误“expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘<’ token“

解决
目前的经历来看,是编译C程序中有C++特性时会出现该错误。
原因清楚,解决就很简单,要么去掉C++特性,要么把扩展名改为CPP

还有一种情况要注意,就是obj目录下的以前编译的中间结果要删除干净,否则会造成误判,比如
1、做了一个A.c,编译通过
2、对A.c复制粘贴改名做出一个A.cpp
3、在A.cpp的头文件里加了一个类,再去编译,就会出现这个expected的错误。
原因不是很清楚,猜测是因为obj没清理,实际上build系统还是去编译A.c,因为A.c和A.cpp实际上用的是一个头文件(这个头文件里已经定义了一个类),此时build系统会发现这个C程序里有C++特性,就会报这个错误。

#1


不知道 现在应用层都没搞定 搞定应用层了 在研究ndk去  

#2


你要贴出来报的什么错误呀

#3


应该ndk了吧

#4


在linux下能编译运行的一段代码  

  拿到android上,make下就报错了..........                                  



你这样问,肯定难倒大家了。。详细点吧。

#5


LZ是为了难道我们还是为了解决问题?

#6


 

#include <stdio.h>

template <class T>
void print_size(T t,int a=6)
{
printf("t = %d\t a = %d\n",sizeof(T),a);
}

typedef struct myint{
int a;
int b;
}mint;

int  operator==(mint a,mint b)
{
if( a.a == b.a && a.b == b.b )
return 1;
return 0;
}

int main()
{
mint m,n;
char s1[10] = "movie";
char s2[10] = "hello";
m.a = n.a = 4;
m.b = n.b = 7;

print_size(5);
print_size('c',5);

if(m==n) print_size(m);


return 0 ;
}

#7


那个问题貌似解决了,原来是因为我的文件名是.c的,Android默认用gcc编译,所以就报错了

汗~~~~~~~~~~~~
我又有另外个问题,
就是编译生成的.o文件,想生成库文件,报错如下
target SharedLib: libos (out/target/product/generic/obj/SHARED_LIBRARIES/libos_intermediates/LINKED/libos.so)
prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/../lib/gcc/arm-eabi/4.4.3/../../../../arm-eabi/bin/ld: out/target/product/generic/obj/SHARED_LIBRARIES/libos_intermediates/src/thread.o: in function bridge(thread*, thread_type_e):external/vgx/libos/src/thread.cpp:25:  error: undefined reference to 'create_posix_thread(char const*, unsigned long, unsigned long, void* (*)(void*), void*, unsigned long)'
这个函数我明明已经包含在头文件中了。
各位大大帮忙指点下....

#8


炫耀吧

#9


如果是.c文件,用下面的方法解决:
#ifdef __cplusplus
extern "C" {
#include <utils/CallStack.h>
}
#endif

类似这样就好了

参考:
问题
编译NDK程序,提示错误“expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘<’ token“

解决
目前的经历来看,是编译C程序中有C++特性时会出现该错误。
原因清楚,解决就很简单,要么去掉C++特性,要么把扩展名改为CPP

还有一种情况要注意,就是obj目录下的以前编译的中间结果要删除干净,否则会造成误判,比如
1、做了一个A.c,编译通过
2、对A.c复制粘贴改名做出一个A.cpp
3、在A.cpp的头文件里加了一个类,再去编译,就会出现这个expected的错误。
原因不是很清楚,猜测是因为obj没清理,实际上build系统还是去编译A.c,因为A.c和A.cpp实际上用的是一个头文件(这个头文件里已经定义了一个类),此时build系统会发现这个C程序里有C++特性,就会报这个错误。