2013-06-12 10 views
5

Mam pytanie związane z CMake na MAC. I upewnić się, że program wykonywalny będzie link ram i bibliotek poprawnie z poniższych kodów:Dlaczego nie mogę połączyć pliku ramowego Maca z CMake?

link_directories(directory_to_framework_and_libs) 
add_executable(program ${FILE_LIST}) 
target_link_libraries(program framework_name lib1 lib2) 

W pierwszej linii kodu, to oznacza miejsce, w którym program wykonywalny może wyszukać ram i bibliotek. W trzecim wierszu kodu struktura i biblioteki będą łączyły się z programem wykonywalnym. Jednak podczas kompilowania xcode.project utworzonego z pliku cmake przy pomocy Xcode 4, projekt wciąż narzeka, że ​​nie może znaleźć -lframework_name: Wszelkie pomysły zostaną docenione.

+2

Trudno powiedzieć, co jest nie tak, bez bardziej szczegółowych informacji. Zasadniczo wydaje się to poprawne. Zalecam jednak, aby unikać używania ['link_directories'] (http://www.cmake.org/cmake/help/v2.8.11/cmake.html#command:link_directories) (zobacz dokumentację, aby uzyskać więcej informacji) i użyj zamiast tego ['find_library'] (http://www.cmake.org/cmake/help/v2.8.11/cmake.html#command:find_library). Umożliwi to przekazanie pełnej ścieżki do biblioteki w wywołaniu 'target_link_libraries', a jeśli biblioteka nie zostanie znaleziona, otrzymasz błąd w czasie konfiguracji CMake, a nie w czasie połączenia. – Fraser

Odpowiedz

15

Nie można połączyć do ramy w ten sposób, trzeba użyć find_library ponieważ zawiera trochę specjalnego traktowania dla ram na OSX.

Ponadto, nie używaj link_directories, CUpewnij wykorzystywać pełne ścieżki do biblioteki i nie jest potrzebne.

Oto kilka prostych przykładów z AudioUnit:

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

Twoje "jeśli nie (...)" powinno być "jeśli (NIE ...)" myślę. – Fraser

+0

Rzeczywiście ... dzięki :) – Guillaume

+0

@Guillaume Dzięki, a teraz działa. – feelfree

11

Innym rozwiązaniem jest następujący:

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

Nie trzeba wszystkie kłopotów (przynajmniej z cmake 2.8.12).

Działa to dobrze:

target_link_libraries(program stdc++ "-framework Foundation" "-framework Cocoa" objc) 

Kiedy CUpewnij widzi parametrów łącza zaczynające się od „-”, to nie ma poprzedzić „-l” i przechodzi argument jak jest z łącznikiem (/ usr/bin/C++).

Trzeba cytaty dotyczące ram tak, że CUpewnij traktuje dwa słowa jako pojedynczy wpis, a nie przed „Fundacji” Na przykład nie dodać „-l”.

Powiązane problemy