2013-06-12 21 views
5

Tôi có một câu hỏi liên quan đến CMake trong MAC. Tôi chắc chắn rằng chương trình thực thi sẽ liên kết các khuôn khổ và các thư viện một cách chính xác với các mã sau:Tại sao tôi không thể liên kết tệp khuôn khổ Mac với CMake?

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

Trong dòng mã đầu tiên, tôi biểu thị vị trí mà chương trình thực thi có thể tìm kiếm các khuôn khổ và thư viện. Trong mã dòng thứ ba, khung công tác và các thư viện sẽ liên kết đến chương trình thực thi. Tuy nhiên, khi tôi biên dịch xcode.project được tạo từ tệp cmake với Xcode 4, dự án tiếp tục phàn nàn rằng nó không thể tìm thấy -lframework_name: ld: library not found -lframework_name Bất kỳ ý tưởng nào cũng sẽ được đánh giá cao.

+2

Thật khó để nói điều gì sai ở đây mà không có chi tiết cụ thể hơn. Trong hiệu trưởng, nó xuất hiện chính xác. Tuy nhiên, tôi khuyên bạn nên tránh sử dụng ['link_directories'] (http://www.cmake.org/cmake/help/v2.8.11/cmake.html#command:link_directories) (xem tài liệu để biết thêm thông tin) và sử dụng ['find_library'] (http://www.cmake.org/cmake/help/v2.8.11/cmake.html#command:find_library) để thay thế. Điều này sẽ cho phép bạn chuyển toàn bộ đường dẫn đến thư viện trong cuộc gọi 'target_link_libraries' và nếu thư viện chưa được tìm thấy, bạn sẽ gặp lỗi tại CMake cấu hình thời gian thay vì ở thời gian liên kết. – Fraser

Trả lời

15

Bạn không thể liên kết đến một khung theo cách này, bạn phải sử dụng find_library vì nó bao gồm một số xử lý đặc biệt cho các khung trên OSX.

Ngoài ra, không sử dụng link_directories, CMake sử dụng đường dẫn đầy đủ đến thư viện và không cần thiết.

Dưới đây là một số ví dụ đơn giản với 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

'Nếu không (...)' của bạn nên là 'nếu (KHÔNG ...)' tôi nghĩ. – Fraser

+0

thực sự ... cảm ơn :) – Guillaume

+0

@Guillaume Cảm ơn, và bây giờ nó hoạt động. – feelfree

11

giải pháp khác là như sau:

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

Bạn không cần phải tất cả các rắc rối này (ít nhất là với cmake 2.8.12).

này hoạt động tốt:

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

Khi CMake thấy một tham số liên kết bắt đầu bằng "-", nó không thêm "-l" và vượt qua đối số như-là để mối liên kết (/ usr/bin/C++).

Bạn cần báo giá cho các khuôn khổ để CMake coi hai từ là một mục nhập duy nhất và không thêm "-l" trước "Foundation" chẳng hạn.

Các vấn đề liên quan