2011-02-08 5 views
12

Chúc mừng tất cả,Xây dựng các thư viện tĩnh trên Mac bằng CMake và GCC?

Tôi có thư viện tĩnh mà sau này tôi liên kết với đơn đăng ký của mình. Môi trường phát triển của tôi là CMake, GCC (Linux, Mac), MinGW (Windows).

Tôi có thể biên dịch thư viện tĩnh mà không gặp bất kỳ sự cố nào trên Linux và Windows. (Tôi thậm chí có thể xây dựng các thư viện được chia sẻ trong ứng dụng của tôi trên Mac).

EDIT: Tôi đã biên soạn thư viện dưới dạng thư viện được chia sẻ và nó hoạt động tốt !!

Tôi đã cấu hình CMakeFile như sau để xây dựng thư viện tĩnh:

add_library(centi STATIC ${base_srcs} ${crv_srcs} ${node_srcs} ${trnk_srcs} ${defl_srcs} ${infl_srcs} ${track_srcs} ${callback_srcs} ${extract_srcs}) 

Trong liên kết giai đoạn, nó mang lại cho các lỗi sau đây và xây dựng "libcenti.a" bằng cách nào đó.

Linking C static library 
lib/libcenti.a /usr/bin/ranlib: file: 
lib/libcenti.a(crv_in_rgn_to_bnry_img.c.o) 
has no symbols /usr/bin/ranlib: file: 
lib/libcenti.a(crv_initialize_by_circle.c.o) 
has no symbols /usr/bin/ranlib: file: 
lib/libcenti.a(crv_initialize_flgs.c.o) 
has no symbols /usr/bin/ranlib: file: 
lib/libcenti.a(crv_nodal_interval_min_and_max.c.o) 
has no symbols /usr/bin/ranlib: file: 
lib/libcenti.a(crv_remove_all_nodes.c.o) 
has no symbols /usr/bin/ranlib: file: 
lib/libcenti.a(crv_reset_nodal_forces.c.o) 
has no symbols /usr/bin/ranlib: file: 
lib/libcenti.a(crv_set_center_coords.c.o) 
has no symbols /usr/bin/ranlib: file: 
lib/libcenti.a(crv_set_left_ptch_rgn_pixs.c.o) 
has no symbols /usr/bin/ranlib: file: 
lib/libcenti.a(crv_set_out_rgn_mean_and_var.c.o) 
has no symbols /usr/bin/ranlib: file: 
lib/libcenti.a(crv_set_para.c.o) has 
no symbols /usr/bin/ranlib: file: 
lib/libcenti.a(crv_set_right_ptch_rgn_pixs.c.o) 
has no symbols /usr/bin/ranlib: file: 
lib/libcenti.a(crv_to_in_rgn_hist.c.o) 
has no symbols /usr/bin/ranlib: file: 
lib/libcenti.a(crv_to_out_rgn_pixs.c.o) 
has no symbols /usr/bin/ranlib: file: 
lib/libcenti.a(trnk_initialize_by_circle.c.o) 
has no symbols /usr/bin/ranlib: file: 
lib/libcenti.a(trnk_initialize_by_image_frame.c.o) 
has no symbols /usr/bin/ranlib: file: 
lib/libcenti.a(trnk_stk_paint_nodes_and_pixs.c.o) 
has no symbols /usr/bin/ranlib: file: 
lib/libcenti.a(trnk_stk_to_inner_defl_ordn.c.o) 
has no symbols 

Nhưng khi tôi liên kết ở trên thư viện với ứng dụng của tôi, nó mang lại cho "biểu tượng Không xác định" lỗi:

Undefined symbols: 
"_setActiveDrawingTrunk", referenced 
from: 
     RzPluginAlgoCnty::initCallBacks()  
in RzPluginAlgoCnty.cpp.o 
     RzPluginAlgoCnty::clearCallBacks()  
in RzPluginAlgoCnty.cpp.o 
     _trnk_trck_ordn in libcenti.a(trnk_trck_ordn.c.o) 
     _trnk_trck_ordn in libcenti.a(trnk_trck_ordn.c.o) 
     _trnk_trck_ordn in libcenti.a(trnk_trck_ordn.c.o) 
     _trnk_trck_ordn in libcenti.a(trnk_trck_ordn.c.o) 
     _bg_trnk_trck_ordn in libcenti.a(trnk_trck_ordn.c.o) 
     _bg_trnk_trck_ordn in libcenti.a(trnk_trck_ordn.c.o) 
     _extract_contour_update_tracking in 
libcenti.a(extract_contour_update_tracking.c.o) 
     _extract_contour_update_tracking in 
libcenti.a(extract_contour_update_tracking.c.o) 
"_updateCurveUICallBack", referenced 
from: 
     RzPluginAlgoCnty::initCallBacks()  
in RzPluginAlgoCnty.cpp.o 
     RzPluginAlgoCnty::initBulkCallBacks() 
in RzPluginAlgoCnty.cpp.o 
     RzPluginAlgoCnty::clearCallBacks()  
in RzPluginAlgoCnty.cpp.o 
     _bg_trnk_trck_ordn in libcenti.a(trnk_trck_ordn.c.o) 
     _bg_trnk_trck_ordn in libcenti.a(trnk_trck_ordn.c.o) 
     _crv_update_1time in libcenti.a(crv_update_ordn.c.o) 
     _crv_update_1time in libcenti.a(crv_update_ordn.c.o) ld: 
symbol(s) not found 

Bất cứ lời khuyên? Tôi có nên thêm bất kỳ thông số đặc biệt nào khi xây dựng các thư viện tĩnh trên máy Mac không?

CHỈNH SỬA: Tôi đã biên soạn thư viện làm thư viện được chia sẻ và nó hoạt động tốt !!

+0

Đồng thời sửa lỗi này bằng cách biên dịch thành thư viện dùng chung. –

+0

* "Trong giai đoạn liên kết, nó cung cấp cho các lỗi sau và xây dựng" libcenti.a "bằng cách nào đó .... không có biểu tượng" * - Đó không phải là lỗi; chúng là những cảnh báo [vô dụng]. Có lẽ bạn đang sử dụng 'libtool' và không phải' ar' và 'ranlib' trên OS X. Tôi nghĩ rằng có một tùy chọn để ngăn chặn nó, nhưng tôi không thể tìm thấy nó vào lúc này. Ngoài ra, hãy xem [Im lặng "mục lục trống" cảnh báo] (https://stackoverflow.com/q/27602998/608639). – jww

Trả lời

6

Các vấn đề tương tự với các thư viện tĩnh trên MacOSX được thảo luận ở đây: http://lists.macosforge.org/pipermail/macports-tickets/2008-June/010680.html

Cố gắng làm đầy đủ sạch sẽ và chạy một xây dựng không song song.

this guide đề xuất cài đặt macports, sau đó "cài đặt cổng sudo autoconf automake nano libtool libsdl patchutils subversion wget gmake", sau đó xuất PATH = "/ usr/local/bin:/usr/local/sbin: $ PATH "

+1

có thể là sự cố khi Mac 'ar' không chuẩn. – osgx

+2

@umanga, bạn đã giải quyết được vấn đề của mình chưa? làm sao? – osgx

7

Cảnh báo từ ranlib cho biết rằng các tệp đối tượng đó không chứa mã hoạt động. Bạn cần xem lại từng tệp nguồn tương ứng để xem liệu mã có chứa nên được biên dịch trên Mac hay không. Nó có thể là mã đã được chuyển đến nơi khác nhưng việc biên dịch có điều kiện không nhận ra chính xác Mac.

Nó không phải là chẩn đoán 'slam dunk'; các biểu tượng bị thiếu rõ ràng trong hai nhóm - các biểu tượng có liên quan đến trnk và các liên quan đến crv - và các tệp tương tự trong hai nhóm (tiền tố trnkcrv), nhưng có thể là các tệp xác định các chức năng khác nhau. Vì vậy, tôi sẽ xem xét các tệp nguồn tương ứng với các tệp đối tượng trống và xem liệu bạn có thể thấy các hàm bị thiếu (có thể bỏ qua dấu gạch dưới hàng đầu trên các tên biểu tượng bị thiếu báo cáo). Nếu các chức năng đó được xác định trong các tệp đó, thì bạn phải xem xét các khiếu nại từ ranlib.

Thỉnh thoảng, nếu bạn hết dung lượng ổ đĩa tại thời điểm bất tiện, bạn có thể có các tệp đối tượng có kích thước bằng 0 (do đó không chứa biểu tượng). Trong trường hợp đó, chỉ cần xóa các tệp đối tượng trống (và giải phóng một số không gian, nhưng bạn phải đã làm điều đó) và xây dựng lại.

+0

cảm ơn bạn đã trả lời. –

+1

Có cách nào để báo cho ranlib bỏ qua các tệp đối tượng này không chứa mã hoạt động không? Tôi có một vài đối tượng tập tin như thế này bởi vì họ có nghĩa là cho các nền tảng khác (ví dụ: Windows chỉ thực hiện khi biên dịch cho OSX). Tôi muốn giữ cho triển khai nền tảng khác trong cmake của tôi vì tôi muốn có thể xem tệp trong IDE của tôi (tôi sử dụng QtCreator) để tôi có thể chỉnh sửa chúng. Thật không may, QtCreator nghĩ rằng họ là lỗi. – mchiasson

+3

Nevermind, tôi nghĩ rằng tôi tìm thấy nó. "-no_warning_for_no_symbols" – mchiasson

8

Rất tiếc, việc đặt -no_warning_for_no_symbols có thể không đủ.Lệnh ar trên máy Mac sẽ chạy ranlib cho bạn, điều này khiến thông báo "không có ký hiệu/usr/bin/ranlib" được hiển thị. Bạn có thể ngừng thông báo này trên Mac bằng cách sử dụng các quy tắc CMake sau:

SET(CMAKE_C_ARCHIVE_CREATE "<CMAKE_AR> Scr <TARGET> <LINK_FLAGS> <OBJECTS>") 
SET(CMAKE_CXX_ARCHIVE_CREATE "<CMAKE_AR> Scr <TARGET> <LINK_FLAGS> <OBJECTS>") 
SET(CMAKE_C_ARCHIVE_FINISH "<CMAKE_RANLIB> -no_warning_for_no_symbols -c <TARGET>") 
SET(CMAKE_CXX_ARCHIVE_FINISH "<CMAKE_RANLIB> -no_warning_for_no_symbols -c <TARGET>") 

Các ARCHIVE_CREATE "Scr" thiết lập sẽ giữ ar chạy ranlib cho bạn. Cài đặt ARCHIVE_FINISH sẽ gag ranlib do khiếu nại về các biểu tượng bị thiếu.

Bạn cần phải sử dụng cả hai bộ quy tắc để gag "không có biểu tượng" tin nhắn.

Một điều nữa cho người mới CMake: Các lệnh CMake tạo cho arranlib lệnh được đổ vào một tập tin LINK.txt. Nếu bạn gặp sự cố khi tạo lưu trữ, bạn có thể muốn xem link.txt để xem CMake đang làm gì cho bạn.