iPhone - Почему компилятор не может найти некоторые включения при сборке для архитектуры ARM? - PullRequest
5 голосов
/ 04 мая 2011

Я пытаюсь использовать библиотеку C в проекте iPhone. Я очень зеленый с разработкой iPhone. Моя библиотека

Я уже несколько дней борюсь за то, чтобы эта библиотека была встроена в статическую библиотеку, которую я могу использовать как для симулятора (i386), так и для ARM7.

Используя библиотеку, включающую конфигурацию и make-файл, я могу собрать библиотеку без проблем. Однако, если я отредактирую make-файл, чтобы попытаться собрать эту же библиотеку, но нацеливаться на архитектуру armv7, я получу много ошибок. Кажется, ошибки сообщают, что некоторые заголовочные файлы не могут быть найдены.

Так пытается ли компилятор искать в разных местах заголовочные файлы в зависимости от целевой архитектуры?

Это файл make, который я отредактировал, чтобы попытаться собрать для armv7:

 # $Id: Makefile.in 62 2005-03-09 21:11:53Z gyunaev $
CC = /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-gcc-4.2.1 
CFLAGS = -Wall -DIN_BUILDING_LIBIRC -O3 -DENABLE_THREADS -D_REENTRANT
AR=ar cr
RANLIB=ranlib
INCLUDES=-I../include


OBJS = libircclient.o

all:    lib

lib:    libircclient.a

install: lib
    -mkdir /usr/local/include
    -mkdir /usr/local/lib
    cp ../include/libircclient.h /usr/local/include/libircclient.h
    cp ../include/libirc_errors.h /usr/local/include/libirc_errors.h
    cp ../include/libirc_events.h  /usr/local/include/libirc_events.h 
    cp libircclient.a /usr/local/include/lib/libircclient.a

$(OBJS): utils.c dcc.c errors.c portable.c sockets.c colors.c

libircclient.a: $(OBJS)
    $(AR) libircclient.a $(OBJS)
    $(RANLIB) libircclient.a

clean:
    rm -f libircclient.a $(OBJS)

distclean: clean
    -rm -f Makefile

.c.o:
    @echo "Compiling  $<"
    @$(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $<

Вот пример ошибок компиляции, которые я испытываю:

Compiling  libircclient.c
In file included from /usr/include/sys/_types.h:33,
             from /usr/include/_types.h:27,
             from /usr/include/stdio.h:64,
             from portable.c:18,
             from libircclient.c:15:
/usr/include/machine/_types.h:36:24: error: arm/_types.h: No such file or directory
In file included from /usr/include/_types.h:27,
             from /usr/include/stdio.h:64,
             from portable.c:18,
             from libircclient.c:15:
/usr/include/sys/_types.h:94: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘__darwin_blkcnt_t’
/usr/include/sys/_types.h:95: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘__darwin_blksize_t’
/usr/include/sys/_types.h:96: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘__darwin_dev_t’

Я все об этом говорю неправильно? Редактировать make-файл тупо? :) Как вы unix ниндзя справиться с этой ситуацией? Некоторые исследования привели меня к мысли, что мне нужно создать универсальную библиотеку ...

Спасибо!

Ответы [ 4 ]

2 голосов
/ 09 мая 2011

Как указано Kay в комментарии, если вы пытаетесь построить из командной строки (или через Make), вы должны указать флаг -isysroot $(SDKROOT), чтобы получить правильные заголовки (в противном случае вы выберите заголовки Mac OS X, которые не обязательно поддерживают ARM.

Самое простое - это построить с помощью XCode или найти версию библиотеки, предназначенную для сборки под iOS, но если вам нужно использовать существующую систему сборки под управлением Make, вы можете адаптировать ее для сборки под iOS, установив:

TARGETSDK = /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.2.sdk
CC = xcrun -sdk $(TARGETSDK) gcc
CFLAGS = -arch armv7 -isysroot $(TARGETSDK) ...

Вы захотите использовать аналогичные xcrun команды для других инструментов, используемых в вашей сборке.

2 голосов
/ 08 мая 2011

Проблема в том, что включаемый файл в / usr / include предназначен для Mac OS X, а не для iPhone / iPad. Если вы хотите, чтобы все заработало, вам нужно добавить (как минимум) флаги, которые Кей упомянула в своем комментарии ...

A намного Более простой способ - использовать XCode. Просто создайте новый проект (выберите статическую библиотеку Cocoa Touch) и добавьте исходные файлы. В соответствии с Makefile вам необходимо добавить: utils.c dcc.c errors.c portable.c sockets.c colors.c

Надеюсь, это поможет.

Вы также можете проверить IRCClient , который является оболочкой Objective-C для используемой вами библиотеки. Нет смысла изобретать велосипед!

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ 5/8/11

Оказывается, оболочка Objective-C предназначена для Mac OS X, а не для iOS

Вот что вам нужно сделать, чтобы компилировать это:

Получите свежие источники:

svn co https://libircclient.svn.sourceforge.net/svnroot/libircclient libircclient

Перейдите в каталог libircclient / trunk / libircclient / src и запустите

./configure

Примечание: это немного грязный трюк. Это действительно настройка для Mac OS X, но в большинстве случаев все достаточно схоже, чтобы это работало. Это создает файл с именем config.h в include.

Запустите XCode и выберите создание новой статической библиотеки Cocoa Touch. При появлении запроса создайте новый каталог libircclient / trunk / libircclient / iOS и сохраните новый проект там.

Добавьте в проект файл libircclient.c из libircclient / trunk / libircclient / src. Оказывается, этот файл включает в себя все остальные файлы C.

Откройте настройки своего проекта и добавьте ../../include к поисковому пути заголовка.

Строй и наслаждайся!

1 голос
/ 09 июля 2013

С Xcode 4.6 все немного изменилось. Вот скрипт, который я использую для конвертации некоторого кода C в ASM, чтобы можно было просмотреть вывод clang для armv7 (thumb2).

#!/bin/bash

DEVROOT=/Applications/Xcode.app/Contents/Developer
SDK=$DEVROOT/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk
CLANG=$DEVROOT/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang

$CLANG \
-x c -arch armv7 \
-std=gnu99 \
-Os \
-isysroot $SDK \
-S code.c -o code.s

Посмотрите на сгенерированные .s, чтобы увидеть выход ARM ASM.

1 голос
/ 05 сентября 2012

У меня был некоторый успех при добавлении следующего к моему .bash_profile:

# OS SDK PATHS
IPHONE_SDK=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk
IPHONESIM_SDK=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.1.sdk
MACOSX_SDK=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk

export IPHONE_SDK
export IPHONESIM_SDK
export MACOS_SDK

C_INCLUDE_PATH=$HOME/local/include:$IPHONE_SDK/usr/include:$IPHONESIM_SDK/usr/include
CPLUS_INCLUDE_PATH=$C_INCLUDE_PATH

export C_INCLUDE_PATH
export CPLUS_INCLUDE_PATH

Это дает добавление всех зависящих от архитектуры заголовочных файлов в вашу папку include.После этого я смог скомпилировать библиотеки C ++ без каких-либо других модификаций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...