1. 程式人生 > >編譯 ios 平臺下的Freeimage 靜態庫

編譯 ios 平臺下的Freeimage 靜態庫

Freeimage的git工程地址:
https://github.com/danoli3/FreeImage

由於Makefile裡面的內容太久,因此重新整理了一份:

但是要注意的是xcode的版本,不同的版本對應的編譯器gcc/clang位置不同.

首先說下我自己的xcode的版本:

在這裡插入圖片描述

這個應該是2018年比較新的版本了.

修改檔案Makefile.iphone

# Configuration for iPhone OS, making static libs
# this will generate both iPhone (arm) and iPhoneSimulator (i386) libs

include Makefile.srcs

CFLAGS = -std=c99 -g -O2 -Wall -Wmissing-prototypes -ffast-math -fno-strict-aliasing -D__ANSI__ -emit-llvm -Wno-c++11-narrowing -Wno-implicit-function-declaration
CXXFLAGS = -std=gnu++14 -stdlib=libc++ -D__ANSI__ -emit-llvm -Wno-c++11-narrowing -Wno-implicit-function-declaration -fvisibility-inlines-hidden

IPHONEOS_DEPLOYMENT_TARGET = 8.3
MACOSX_DEPLOYMENT_TARGET = 10.14

PLATFORM_SIM = iPhoneSimulator
PLATFORM_PHONE = iPhoneOS

ARCH_SIM = i386
ARCH_PHONE = arm64

PLATFORM_DEVELOPER_BIN_DIR = /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

SDKROOT_SIM = $(shell xcode-select -print-path)/Platforms/$(PLATFORM_SIM).platform/Developer/SDKs/$(PLATFORM_SIM)$(IPHONEOS_SDK).sdk
SDKROOT_PHONE = /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk

EXTRA_CFLAGS_SIM += -arch $(ARCH_SIM) -pipe -mdynamic-no-pic -fvisibility=hidden $(INCLUDE) -isysroot $(SDKROOT_SIM)
EXTRA_CFLAGS_SIM += -D__IPHONE_OS_VERSION_MIN_REQUIRED=20000 -mmacosx-version-min=$(MACOSX_DEPLOYMENT_TARGET)

# Xcode complains about the -mdynamic-no-pic with an Apple Mach-O Linker Warning, so removed
EXTRA_CFLAGS_PHONE += -arch $(ARCH_PHONE) -pipe -fvisibility=hidden $(INCLUDE) -isysroot $(SDKROOT_PHONE)
EXTRA_CFLAGS_PHONE += -miphoneos-version-min=$(IPHONEOS_DEPLOYMENT_TARGET)

CC = $(PLATFORM_DEVELOPER_BIN_DIR)/clang
CXX = $(PLATFORM_DEVELOPER_BIN_DIR)/clang++
LIBTOOL = $(PLATFORM_DEVELOPER_BIN_DIR)/libtool

CFLAGS_SIM = $(CFLAGS) $(EXTRA_CFLAGS_SIM)
CXXFLAGS_SIM += $(EXTRA_CFLAGS_SIM) $(CXXFLAGS)

CFLAGS_PHONE = $(CFLAGS) $(EXTRA_CFLAGS_PHONE)
CXXFLAGS_PHONE += $(EXTRA_CFLAGS_PHONE) $(CXXFLAGS)

TARGET = freeimage
STATICLIB_SIM = lib$(TARGET)-simulator.a
STATICLIB_PHONE = lib$(TARGET)-$(ARCH_PHONE).a
HEADER = Source/FreeImage.h

.SUFFIXES: .o-$(ARCH_SIM) .o-$(ARCH_PHONE)
MODULES_ARM = $(SRCS:.c=.o-$(ARCH_PHONE))
MODULES_ARM := $(MODULES_ARM:.cpp=.o-$(ARCH_PHONE))
MODULES_SIM = $(SRCS:.c=.o-$(ARCH_SIM))
MODULES_SIM := $(MODULES_SIM:.cpp=.o-$(ARCH_SIM))

default: all

all: dist

dist: FreeImage
	mkdir -p Dist
	cp *.a Dist/
	cp Source/FreeImage.h Dist/

FreeImage: $(STATICLIB_PHONE)

$(STATICLIB_SIM): $(MODULES_SIM)
	$(LIBTOOL) -arch_only $(ARCH_SIM) -o 
[email protected]
$(MODULES_SIM) .c.o-$(ARCH_SIM): $(CC) $(CFLAGS_SIM) -c $< -o [email protected] .cpp.o-$(ARCH_SIM): $(CXX) $(CXXFLAGS_SIM) -c $< -o [email protected] $(STATICLIB_PHONE): $(MODULES_ARM) $(LIBTOOL) -arch_only $(ARCH_PHONE) -o [email protected] $(MODULES_ARM) .c.o-$(ARCH_PHONE): $(CC) $(CFLAGS_PHONE) -c $< -o
[email protected]
.cpp.o-$(ARCH_PHONE): $(CXX) $(CXXFLAGS_PHONE) -c $< -o [email protected] clean: rm -f core Dist/*.* u2dtmp* $(MODULES_SIM) $(MODULES_ARM) $(STATICLIB_SIM) $(STATICLIB_PHONE)

然後我們的在cmd命令模式下執行:

make -f Makefile.iphone

核心思想就是指定編譯器去編譯:

我的這個版本對應的編譯器是clang.
路徑是:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

這裡有一個注意,有時候我們需要編譯:arm64 armv7 armv7s的cpu架構的 。

在這裡插入圖片描述

經常上面的操作後,我們得到了三個價格的庫:

在這裡插入圖片描述

接下來我們要使用,所以我們需要把這三個庫合併為一個庫,這樣我們自己更換平臺的都會連結的上.

呼叫命令:

lipo -create libfreeimage-arm64.a libfreeimage-armv7.a libfreeimage-armv7s.a -output libfreeimage.a

我們就把這三個庫合併為一個了.