2009-05-04 16 views
24

Bu, iPhone üzerinde statik bir kitaplık oluşturmak için CMake kullanma ile ilgili olan previous question ile yakından ilişkilidir. Bunu CMAKE_OSX_SYSROOT ayarını yapmaya çalıştım. Bununla birlikte, bu bir uygulama oluşturmak için işe yaramamaktadır.iPhone için bir uygulama oluşturmak için CMake nasıl kurulur

project(TEST) 

set(CMAKE_OSX_SYSROOT iphoneos2.2.1) 
set(CMAKE_OSX_ARCHITECTURES "$(ARCHS_STANDARD_32_BIT)") 
set(CMAKE_EXE_LINKER_FLAGS 
"-framework Foundation -framework OpenGLES -framework AudioToolbox -framework CoreGraphics -framework QuartzCore -framework UIKit -framework OpenAL" 
) 

set(SRC --my files--) 

add_executable(iphone-test MACOSX_BUNDLE ${SRC}) 

Birkaç notlar: Ben açıkça find_library çerçeveler tamamı için işe yaramadı çünkü -framework bağlama seçeneği veriyorum

  • (Bu çoğu bulundu, ancak My CMakeLists.txt benziyor OpenGLES). Nedenini anlamadım çünkü hepsi aynı klasörde ${SDK}/System/Library/Frameworks. Bu, yanlış bir şey yaptığımı düşünmeme yol açıyor, ama ne olduğunu bilmiyorum.
  • add_executable komutuna eklendim, bu nedenle üretilen ürün türü, iPhone'da görünüşte bulunmayan com.apple.product-type.tool yerine com.apple.product-type.application olacaktır. Her durumda

, uygulama derler ve bağlantıları doğru ama simülatörde çalıştırdığınızda, ben korkunç

Failed to launch simulated application: Unknown error. 

google ve stackoverflow bu sorunun bildirimlerini çok var olsun Ancak, çözümlerin tümü yeni bir projenin ve hareketli dosyaların temizlenmesini veya oluşturulmasını içerir; fakat CMake çalışmasının ardından yeni bir kopyasını derledim, bu yüzden hiçbiri geçerli değil.

CMake posta listesinde this thread buldum, ancak yalnızca bir kitaplık oluşturmanın başarısını bildiriyor ve sonra da pazarlık yapıyor.

cevap

41

Bunu nasıl yapacağımı anladım. Açıkçası

project(test) 
set(NAME test) 

file(GLOB headers *.h) 
file(GLOB sources *.cpp) 

set(CMAKE_OSX_SYSROOT iphoneos2.2.1) 
set(CMAKE_OSX_ARCHITECTURES $(ARCHS_STANDARD_32_BIT)) 
set(CMAKE_CXX_FLAGS "-x objective-c++") 
set(CMAKE_EXE_LINKER_FLAGS 
    "-framework AudioToolbox -framework CoreGraphics -framework QuartzCore -framework UIKit" 
) 
link_directories(\${HOME}/\${SDKROOT}/lib) 

set(MACOSX_BUNDLE_GUI_IDENTIFIER "com.mycompany.\${PRODUCT_NAME:identifier}") 
set(APP_TYPE MACOSX_BUNDLE) 

add_executable(${NAME} 
    ${APP_TYPE} 
    ${headers} 
    ${sources} 
) 

target_link_libraries(${NAME} 
    # other libraries to link 
) 

# code signing 
set_target_properties(${NAME} PROPERTIES XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer: My Name") 

, şirketinizin adına değişim mycompany ve adınızın My Name değiştirin: İşte benim CMakeLists.txt dosya böyle görünüyor. Yukarıda belirtildiği gibi \${HOME}/\${SDKROOT}/lib bağlantı dizinini eklemenin çok yararlı olduğunu öğrendim, böylece uygulamanız statik bir kütüphaneye (özellikle de genel olmayan (iPhone) olmayan bir kütüphaneye) bağlanıyorsa, ayrı iPhoneOS ve iPhoneSimulator kütüphaneleri oluşturabilir ve sağa kolayca bağlanabilirsiniz. Bir, evrensel bir ikili hakkında endişelenmek yerine. Ayrıca, CMake kullanarak proje oluştururken Xcode, kaynakları düzgün bir şekilde eklemiyor gibi görünmüyor, bu nedenle bu parçayı CMakeLists.txt dosyasına ekledim. Üste | /data klasörünün tamamını, kaynak klasörüme kopyalar (Xcode'ta bir "mavi" klasör bağlantısı eklediysem).

# copy resource phase 

set(APP_NAME \${TARGET_BUILD_DIR}/\${FULL_PRODUCT_NAME}) 
set(RES_DIR ${test_SOURCE_DIR}/data) 
add_custom_command(
    TARGET ${NAME} 
    POST_BUILD 
    COMMAND /Developer/Library/PrivateFrameworks/DevToolsCore.framework/Resources/pbxcp -exclude .DS_Store -exclude CVS -exclude .svn -resolve-src-symlinks ${RES_DIR} ${APP_NAME} 
) 
+0

Cevabınızı çok faydalı buldum - CMake ve Xcode ile gerçekten kayboldum. CMakeLists dosyanızın biraz değiştirilmiş bir sürümünü kullanmayı denedim. Ancak bazı garip problemlere rastladım. Belki de soruma bir bakar mısınız? http://stackoverflow.com/questions/5473448/cmake-and-xcode-cannot-find-interface-declaration-for-nsobject Şimdiden teşekkürler :) – Shade

+2

Şimdi kaynakların başka bir yolu var, buraya bakın: http://cmake.org/gitweb?p=cmake.git;a=blob;f=Tests/iOSNavApp/CMakeLists.txt Bununla birlikte, bu dizin hiyerarşisini kaldırır, bu nedenle çift dosya adlarını bir sorun haline getirirsiniz ... –

1

Son CKağıt versiyonları uzantısı yoluyla dilini algılar C++ derleyicisi, hiç .m ve, mm dosyaları geçmesi, bu yüzden açıkça bayrak "-x amaç-C++" eklemenize gerek yoktur.çerçeveler için

+2

Oh evet, bu sadece tesadüfi senaryoya Aslında .cpp dosyalarına sahibim (çapraz derleme yaptığım için), buna ihtiyacım var. –

+0

@JesseBeder: Neden .cpp' dosyalarını objektif-C++ olarak derliyorsunuz? .cpp' dosyalarını C++ olarak derledik ve Kakao'yla etkileşime girmesi gereken platforma özgü işlevlerle bir. –

+0

@JanHudec, '.cpp' dosyalarından bazılarında koşullu olarak Objective-C (bir' # ifdef' ile) içerir, dolayısıyla iPhone için derlendiğinde Objective-C ile etkileşimde bulunurlar (ve Object-C++ olarak değerlendirilmelidir) ama PC için derlendiğinde, onlar (yani C++ olarak düşünülmelidir). –

7

, ben bunun için yeterli bilgi yakaladı bu mesajı http://www.mail-archive.com/[email protected]/msg24659.html bulundu:

SET(TARGETSDK iPhoneOS3.1.2.sdk) 
SET(CMAKE_OSX_SYSROOT /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/${TARGETSDK}) 
macro(ADD_FRAMEWORK fwname appname) 
    find_library(FRAMEWORK_${fwname} 
     NAMES ${fwname} 
     PATHS ${CMAKE_OSX_SYSROOT}/System/Library 
     PATH_SUFFIXES Frameworks 
     NO_DEFAULT_PATH) 
    if(${FRAMEWORK_${fwname}} STREQUAL FRAMEWORK_${fwname}-NOTFOUND) 
     MESSAGE(ERROR ": Framework ${fwname} not found") 
    else() 
     TARGET_LINK_LIBRARIES(${appname} ${FRAMEWORK_${fwname}}) 
     MESSAGE(STATUS "Framework ${fwname} found at ${FRAMEWORK_${fwname}}") 
    endif() 
endmacro(ADD_FRAMEWORK) 

yerine CMAKE_EXE_LINKER_FLAGS ayar, şimdi biliyorum:

ADD_FRAMEWORK(AudioToolbox MyApp) 
ADD_FRAMEWORK(CoreGraphics MyApp) 
ADD_FRAMEWORK(QuartzCore MyApp) 
ADD_FRAMEWORK(UIKit MyApp) 

Bu OpenGLES için çalışma yanı yok.

+0

Bu, "Diğer Bağlayıcı Bayrakları" AKA OTHER_LDFLAGS çerçevelerini ekliyor gibi görünüyor, ancak "Başlık Arama Yolları" başlığına hiçbir şey eklemiyor gibi görünüyor, bu yüzden kodum UIKit/UIKit.h bulamıyor. Öneriler? – Emmanuel

İlgili konular