当前位置:首页 » 编程软件 » 使用makefile编译

使用makefile编译

发布时间: 2025-04-12 06:20:39

‘壹’ 如何使用自己的makefile编译android ndk项目

android ndk提供了一套自己的makefile管理方式,要将源码项目移植到android平台,需要按照android的makefile规则编写makefile,还要按android的规则部署源码目录,对一个有自己的makefile管理方法的大型项目来说,只是做一下makefile迁移工作就是一件很麻烦的事。
其实android ndk上的编译说到底也就是交叉编译,只要配置好交叉编译工具链,使用原有的makefile也是可以编译出在android运行的c、c++程序的。
以android-ndk-r4-crystax的ndk版本为例:
编译器路径 android-ndk-r4-crystax/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin
名称前缀 arm-eabi-
头文件目录 android-ndk-r4-crystax/build/platforms/android-3/arch-arm/usr/include
库文件目录 android-ndk-r4-crystax/build/platforms/android-3/arch-arm/usr/lib
你可以试一下上面的配置,如果编译链接都没有问题,可以adb push到android设备上运行看看,什么结果?
有点崩溃,根本运行不起来,你也许想试试看android自带的ndk例子,确实是能够运行的,问题在哪儿呢?
只是正确配置了编译器、头文件、库文件还不够,还需要配置编译、链接的参数,android例子中编译链接的参数是什么呢?你也许想深究一下android的makefile,可是不久你会发现那是更崩溃的事情,里面用了很多的make脚本函数。其实android的makefile是可以把执行的详细命令输出来的,只要make的时候加上V=1即可。可以看到确实带了很多参数
编译参数:
-fpic
-mthumb-interwork
-ffunction-sections
-funwind-tables
-fstack-protector
-fno-short-enums
-Wno-psabi
-march=armv5te
-mtune=xscale
-msoft-float
-mthumb
-fomit-frame-pointer
-fno-strict-aliasing
-finline-limit=64
-Wa,--noexecstack
-D__ARM_ARCH_5__
-D__ARM_ARCH_5T__
-D__ARM_ARCH_5E__
-D__ARM_ARCH_5TE__
-DANDROID
链接参数:

-nostdlib
-Bdynamic
-Wl,-dynamic-linker,/system/bin/linker
-Wl,--gc-sections
-Wl,-z,noreloc
-Wl,--no-undefined
-Wl,-z,noexecstack
-L$(PLATFORM_LIBRARY_DIRECTORYS)
crtbegin_static.o
crtend_android.o
这其中链接参数中的-Wl,-dynamic-linker,/system/bin/linker、crtbegin_static.o、crtend_android.o是最关键的,android使用了自己的进程加载器,并且自定义了c运行时的启动结束。难怪先前编译的进程启动不了。

‘贰’ 在VC里如何用Makefile文件编译

在Visual C++中编译使用Makefile文件,首先打开命令提示符(cmd.exe)或在Windows 9x中使用command.com,然后进入Visual C++的bin目录,运行vc-vars32.bat设置环境变量。之后进入Makefile所在的目录,并使用nmake /f makefile进行编译。从sourceforge下载的libjpeg源代码包含了一个makefile.vc文件,通过nmake /f makefile.vc [nodebug=1]可以编译静态库,但若需编译成dll,以便在如emacs等程序中使用,则需对makefile.vc和jmorecfg.h文件进行修改。

在makefile.vc文件中,需添加编译dll的规则如下所示:

libjpeg.lib: $(LIBOBJECTS)

$(RM) libjpeg.lib

lib -out:libjpeg.lib $(LIBOBJECTS)

添加以下行:

libjpeg.dll: $(LIBOBJECTS)

$(RM) libjpeg.dll

link -dll -out:libjpeg.dll $(LIBOBJECTS)

在jmorecfg.h中添加:

#define _WIN32_

#define JPEG_DLL

修改完成后,使用nmake /f makefile.vc nodebug=1即可编译。

将makefile复制为.mak文件,通过Visual C++打开即可,.mak文件实质上就是一个makefile文件,它能够指定编译的具体命令,以及必须先设置VC命令行环境。

vcvars32.bat用于设置环境变量,在Visual C++ 98的bin目录下执行nmake /f XXXX.mak,如果有makefile文件,则直接使用nmake即可。

这种方法适用于需要自定义编译规则或特定环境配置的情况,通过修改makefile文件,可以实现更灵活的编译方式。

‘叁’ 刚下的一个大型C程序包里面有很多头文件C文件还有makefile文件,请问怎样编译运行这个文件啊!

进入包含C程序包的目录后,可以使用make命令来编译这个程序包。Makefile文件通常会定义编译规则,包括如何编译各个源文件以及链接所需的库文件。首先确保你的开发环境已经安装了必要的编译工具,如GCC。然后在程序包的根目录下输入make命令,Make工具会根据Makefile文件中的规则自动编译所有需要的源文件。如果Makefile中定义了安装规则,编译完成后还可以通过make install命令将程序安装到系统目录中。

编译过程中可能会遇到各种错误,这些错误信息通常会帮助你定位问题所在。常见的错误包括未找到头文件、链接错误等。对于头文件未找到的问题,确保包含了所有必要的头文件路径;对于链接错误,检查Makefile中的库路径和库名是否正确。如果需要手动编译而不是使用make,可以通过编译器命令,如gcc,来编译各个源文件。例如,如果源文件名为main.c,可以使用命令gcc main.c -o main来编译并生成可执行文件。

编译完成后,生成的可执行文件通常会在当前目录下。可以直接运行这个可执行文件来测试程序的功能。如果Makefile中定义了运行测试的脚本或者命令,也可以通过make run或者make test来执行。不过,最好还是直接运行生成的可执行文件,以确保程序按预期运行。

如果编译或运行过程中遇到问题,可以查阅Makefile文件中的注释或者搜索相关错误信息,通常能找到解决办法。如果问题依然无法解决,可以考虑查看程序包的README文件,里面可能包含了编译和运行的详细说明。

总之,使用make命令是最简便的方式编译大型C程序包。如果make命令无法满足需求,也可以通过手动编译来完成编译过程。无论是哪种方式,正确处理编译和运行过程中的错误信息都是关键。

热点内容
怎么配置serial窗口 发布:2025-04-25 23:32:24 浏览:961
java配置路径 发布:2025-04-25 23:29:44 浏览:824
闪迪存储卡g 发布:2025-04-25 23:24:51 浏览:211
c语言和It 发布:2025-04-25 23:18:22 浏览:694
c语言简单程序设计 发布:2025-04-25 23:13:14 浏览:593
c语言编程思路 发布:2025-04-25 23:08:08 浏览:341
安卓开发存储空间多少则为不足 发布:2025-04-25 22:54:55 浏览:541
视频课堂源码 发布:2025-04-25 22:52:55 浏览:982
庭院植物配置需要什么 发布:2025-04-25 22:46:47 浏览:985
存储卡ntfs 发布:2025-04-25 22:42:57 浏览:76