2013-06-12 16 views
5

CMake in MAC ile ilgili bir sorunuz var. Ben yürütülebilir programı aşağıdaki kodları ile doğru çerçeve ve kütüphaneler bağlayacak emin olun:Mac framework dosyasını neden CMake ile bağlayamıyorum?

İlk satır kodunda
link_directories(directory_to_framework_and_libs) 
add_executable(program ${FILE_LIST}) 
target_link_libraries(program framework_name lib1 lib2) 

, ben çalıştırılabilir program çerçevesinde ve kütüphaneler arayabilirsiniz konumunu belirtir. Üçüncü satır kodunda, çerçeve ve kütüphaneler yürütülebilir programa bağlanır. Xcode 4 ile cmake dosyasından oluşturulan xcode.project derlemek Ancak, proje bu -lframework_name bulamadığını şikayet edip duruyor: ld: library not found -lframework_name Herhangi bir fikir takdir edilecektir. o OSX'te çerçeveler için bazı özel işlem içerdiğinden

+2

Burada daha spesifik detaylar olmadan neyin yanlış olduğunu söylemek zor. Müdür olarak doğru görünüyor. Ancak, ['link_directories'] kullanımından kaçınmanızı tavsiye ederim (http://www.cmake.org/cmake/help/v2.8.11/cmake.html#command:link_directories) (daha fazla bilgi için belgelere bakın) ve bunun yerine ['find_library'] (http://www.cmake.org/cmake/help/v2.8.11/cmake.html#command:find_library) kullanın. Bu, 'target_link_libraries' çağrısındaki kütüphaneye giden tüm yolu iletmenize olanak tanır ve kütüphane bulunamamışsa, bağlantı zamanından ziyade CMake yapılandırmasında bir hata alırsınız. – Fraser

cevap

15

Sen find_library kullanmak zorunda, bir çerçeveye bu şekilde bağlayamazsınız. link_directories kullanmayın Ayrıca

, CKağıt kütüphanelerine tam yolları kullanma ve gerekli değil.

İşte AudioUnit bazı basit bir örnek şu şekildedir:

find_library(AUDIO_UNIT AudioUnit) 
if (NOT AUDIO_UNIT) 
    message(FATAL_ERROR "AudioUnit not found") 
endif() 

add_executable(program ${program_SOURCES}) 
target_link_libraries(program ${AUDIO_UNIT}) 
+1

"Eğer değilse (…)", eğer (NOT ...) 'olmalıdır. – Fraser

+0

gerçekten ... teşekkürler :) – Guillaume

+0

@Guillaume Teşekkürler, ve şimdi çalışıyor. – feelfree

11

başka çözüm:

target_link_libraries(program "-framework CoreFoundation") 
target_link_libraries(program "-framework your_frame_work_name) 
set_target_properties(program PROPERTIES LINK_FLAGS "-Wl,-F/Library/Frameworks") 
5

Sen (en azından cmake 2.8.12) ile tüm bu güçlük gerekmez.

Bu çalışıyor:

CKağıt ile başlayan bir bağlantı parametresi görür
target_link_libraries(program stdc++ "-framework Foundation" "-framework Cocoa" objc) 

"-", "-l" Önlerine etmez ve (/ usr/bin bağlayıcıya olduğu gibi argüman geçer/C++). CKağıt tek girdi olarak iki kelime davranır ve örneğin "Vakfı" önce "-l" ekle kalmaması

Sen çerçeveler için tırnak gerekir.