NDK编译cpp和c文件

来源:互联网 发布:淘宝靠谱的ipad二手店 编辑:程序博客网 时间:2024/05/17 08:48

NDK会自动编译LOCAL_SRC_FILES目录指定的cpp或c文件。如果是cpp会自动用c++编译器,如果是c那么自动用c编译器。

mk文件有一个LOCAL_CPP_EXTENSION属性,设置的是用c++编译的文件后缀。下面是官方描述:

Note that the default extension for C++ source files is '.cpp'. It ishowever possible to specify a different one by defining the variableLOCAL_CPP_EXTENSION. Don't forget the initial dot (i.e. '.cxx' willwork, but not 'cxx').

我们可以指定, .cxx文件也由c++编译器编译。

那么我们如何指定c编译器编译呢,很遗憾没有这个设定。但是还是有办法的,就是修改ndk的脚本,在NDK目录例如,android-ndk-r8\build\core的build-binary.mk文件控制了编译过程。

## Check LOCAL_CPP_EXTENSION, use '.cpp' by default#bad_cpp_extensions := $(strip $(filter-out .%,$(LOCAL_CPP_EXTENSION)))ifdef bad_cpp_extensions    $(call __ndk_info,WARNING: Invalid LOCAL_CPP_EXTENSION values: $(bad_cpp_extensions))    LOCAL_CPP_EXTENSION := $(filter $(bad_cpp_extensions),$(LOCAL_CPP_EXTENSIONS))endifLOCAL_CPP_EXTENSION := $(strip $(LOCAL_CPP_EXTENSION))ifeq ($(LOCAL_CPP_EXTENSION),)  LOCAL_CPP_EXTENSION := .cppelseendif

这段控制编译c++的文件后缀,默认是.cpp

$(foreach src,$(filter %.c,$(LOCAL_SRC_FILES)), $(call compile-c-source,$(src),$(call get-object-name,$(src))))$(foreach src,$(filter %.S %.s,$(LOCAL_SRC_FILES)), $(call compile-s-source,$(src),$(call get-object-name,$(src)))) $(foreach src,$(filter $(all_cpp_patterns),$(LOCAL_SRC_FILES)),\    $(call compile-c-source,$(src),$(call get-object-name,$(src)))\)

这段是调用脚本编译c和cpp文件, 这里我把cpp文件也由c编编译器来编译了,call compile-c-source 这句就是调用c的编译器编译。

最终,.cpp文件也会有c编译器编译,控制台会输出Compile thumb ,而不是Compile thumb++。

为什么要这么做,因为NDK的例子,添加了NDKdebug功能后,我发现c文件eclipse不能正确导入头文件,而把文件改成cpp就可以,这是NDK native debug功能的一个bug。所以如果我们写c代码,改成cpp后缀,就能正确使用eclipse的代码提示和编译,在用c编译器编译cpp文件。


1 0
原创粉丝点击