Nhà phát triển phần mềm chuyển từ Linux sang OS X, gotchas là gì?


50

Tôi đã sử dụng Ubuntu / Fedora / Red Hat / Suse nhưng chưa sử dụng OS X. Nếu tôi phải bắt đầu sử dụng OS X thường xuyên, những điều tôi nên chú ý là gì?

Các công cụ tôi sử dụng là chuỗi công cụ GNU, C ++ / Boost, v.v.


Bạn sẽ phát triển các ứng dụng Unix / Linux thông thường hơn hay ứng dụng Mac OSX?
David Thornley

1
Ít nhất là lúc đầu các ứng dụng Unix / Linux thông thường hơn, tôi chỉ sử dụng PC OS X làm máy trạm.
Grokus

Câu trả lời:


52

Tôi đã thực hiện cùng một động thái nhiều năm trước. Dưới đây là những điều tôi gặp phải:

  • Linux máy tính để bàn trung bình của bạn có vùng người dùng phong phú hơn so với OS X.

    Bạn có thể sẽ bỏ lỡ các công cụ khác nhau so với tôi đã làm, vì vậy sẽ không có ý nghĩa cụ thể về các đề xuất thay thế.

    Thay vào đó, chỉ cần cài đặt Fink , MacPorts hoặc Homebrew trước tiên. Các hệ thống này cung cấp một hệ thống quản lý gói điển hình của Linux hoặc BSD. Mỗi loại có hương vị riêng và bộ gói, vì vậy sự lựa chọn đúng sẽ dựa trên thị hiếu và nhu cầu của bạn.

    Bạn có thể thấy rằng không có một hệ thống gói nào có mọi chương trình bạn cần. Một số chương trình chưa được chuyển sang OS X, vì vậy chúng sẽ không xuất hiện trong bất kỳ hệ thống gói nào . Tuy nhiên, các hệ thống này thực sự mở rộng đáng kể những gì được cung cấp với OS X và sẽ giúp bạn dễ dàng chuyển đổi từ Linux.

  • Trình biên dịch dòng lệnh OS X hiện xây dựng các tệp thực thi 64 bit theo mặc định.

    Thay vào đó, trong Leopard và các trình biên dịch đã xây dựng các tệp thực thi 32 bit theo mặc định. Điều này có thể gây ra sự cố theo nhiều cách: có thể bạn có các thư viện 32 bit cũ mà bạn không thể xây dựng lại nhưng phải liên kết đến, có thể bạn vẫn đang chạy hệ thống của mình ở chế độ 32 bit, v.v.

    Một cách để buộc xây dựng 32 bit là ghi đè gccmặc định trong các hệ thống xây dựng gcc-4.0, đó là trình biên dịch Leopard 32 bit theo mặc định cũ. ( gcclà một liên kết tượng trưng đến 64 bit theo mặc định gcc-4.2trên Snow Leopard.) Với các hệ thống xây dựng dựa trên autoconf, điều này hoạt động:

    $ ./configure CC=gcc-4.0 CXX=g++-4.0
    

    (Bạn chỉ cần CXXbit nếu chương trình chứa các thành phần C ++.)

    Một cách khác là chuyển -m32đến trình biên dịch và trình liên kết:

    $ ./configure CFLAGS=-m32 CXXFLAGS=-m32 LDFLAGS=-m32
    

    Nó gõ nhiều hơn, nhưng nó cho phép bạn có các bản dựng 32 bit từ GCC mới hơn.

  • Liên kết động là rất khác nhau.

    Nếu bạn là người thích viết các ldlệnh của mình bằng tay, đã đến lúc bỏ thói quen đó. Thay vào đó, bạn nên liên kết các chương trình và thư viện thông qua trình biên dịch hoặc sử dụng một trung gian như libtool. Chúng quan tâm đến sự khác biệt của sơ đồ liên kết nền tảng cụ thể, vì vậy bạn có thể tiết kiệm năng lượng cho các chương trình học mà bạn không thể trừu tượng hóa bằng các cơ chế di động.

    Chẳng hạn, bạn sẽ cần cập nhật bộ nhớ cơ để bạn nhập otool -L someprogramthay vì ldd someprogramtìm ra thư viện nào someprogramđược liên kết.

    Một sự khác biệt khác trong liên kết động lúc đầu sẽ xoắn não bạn là trên OS X, vị trí cài đặt cho thư viện được ghi lại trong chính thư viện và trình liên kết sao chép vào tệp thực thi tại thời điểm liên kết. Điều này có nghĩa là nếu bạn liên kết đến một thư viện đã được cài đặt /usr/local/libnhưng bạn muốn gửi nó cho người dùng của mình trong cùng thư mục với tệp thực thi, bạn cần nói một cái gì đó như thế này như là một phần của quá trình cài đặt của bạn:

    $ cp /usr/local/lib/libfoo.dylib .
    $ install_name_tool -id @loader_path/libfoo.dylib libfoo.dylib
    $ make LDFLAGS=-L. relink
    

    Bây giờ, phần lớn những điều trên có thể thay đổi cho hệ thống xây dựng của bạn, vì vậy chỉ lấy nó làm ví dụ, thay vì công thức. Điều này làm cho một bản sao riêng của thư viện mà chúng ta liên kết đến, thay đổi định danh thư viện dùng chung từ một đường dẫn tuyệt đối thành một nghĩa tương đối "trong cùng thư mục với tệp thực thi", sau đó buộc xây dựng lại tệp thực thi đối với bản sao đã sửa đổi này của thư viện.

    install_name_toollà lệnh cốt lõi ở đây. Nếu thay vào đó, bạn muốn cài đặt thư viện trong một ../libthư mục liên quan đến tệp thực thi, thì -idđối số sẽ cần phải được @loader_path/../lib/libfoo.dylibthay thế.

    Joe Di Pol đã viết một bài viết hay về điều này , với nhiều chi tiết hơn.

  • Liên kết động + gói bên thứ ba có thể gây đau đầu sớm.

    Bạn có thể sớm gặp phải các vấn đề liên kết động, ngay khi bạn bắt đầu thử sử dụng các thư viện từ các gói của bên thứ ba không cài đặt các thư viện vào các vị trí tiêu chuẩn. MacPorts thực hiện việc này, ví dụ, cài đặt thư viện vào /opt/local/lib, chứ không phải /usr/libhoặc /usr/local/lib. Khi bạn gặp phải vấn đề này, một cách khắc phục tốt cho vấn đề là thêm các dòng như sau vào .bash_profile:

    # Tell the dynamic linker (dyld) where to find MacPorts package libs
    export DYLD_LIBRARY_PATH=/opt/local/lib:$DYLD_LIBRARY_PATH
    
    # Add MacPorts header file install dirs to your gcc and g++ include paths
    export C_INCLUDE_PATH=/opt/local/include:$C_INCLUDE_PATH
    export CPLUS_INCLUDE_PATH=/opt/local/include:$CPLUS_INCLUDE_PATH
    
  • OS X xử lý vấn đề tương thích CPU khác với Linux.

    Trên Linux 64 bit, bạn cũng phải hỗ trợ 32 bit vì bất kỳ lý do gì, bạn kết thúc với hai bản sao của các thư viện cần ở cả hai định dạng, với các phiên bản 64 bit tắt trong một lib64thư mục song song với libthư mục truyền thống .

    OS X giải quyết vấn đề này theo cách khác, với khái niệm nhị phân phổ quát, cho phép bạn đặt nhiều tệp nhị phân vào một tệp. Hiện tại bạn có thể có các tệp thực thi hỗ trợ tối đa 4 loại CPU: PowerPC 32 và 64 bit, cộng với Intel 32 và 64 bit.

    Thật dễ dàng để xây dựng các nhị phân phổ quát với Xcode, nhưng hơi khó khăn với các công cụ dòng lệnh. Điều này giúp bạn có bản dựng chỉ dành cho Intel với các hệ thống xây dựng dựa trên Autoconf:

    $ ./configure --disable-dependency-tracking CFLAGS='-arch i386 -arch x86_64' \
      LDFLAGS='-arch i386 -arch x86_64'
    

    Thêm -arch ppc -arch ppc64vào CFLAGSLDFLAGSnếu bạn cần hỗ trợ PowerPC.

    Nếu bạn không tắt theo dõi phụ thuộc, cuối cùng bạn chỉ xây dựng cho một nền tảng, vì sự hiện diện của .ocác tệp được xây dựng mới cho nền tảng đầu tiên cũng thuyết phục make(1)rằng nó cũng không cần phải xây dựng cho nền tảng thứ hai. Tất cả mọi thứ phải được xây dựng hai lần trong ví dụ trên; bốn lần cho một nhị phân hoàn toàn phổ quát, nếu bạn vẫn cần hỗ trợ PowerPC.

    (Thông tin thêm trong Ghi chú kỹ thuật của Apple TN2137 .)

  • Các công cụ dành cho nhà phát triển không được cài đặt trên OS X theo mặc định.

    Trước Lion, nơi đáng tin cậy nhất để có được các công cụ phát triển phù hợp cho hệ thống của bạn là trên các đĩa hệ điều hành. Chúng là một cài đặt tùy chọn.

    Điều tuyệt vời khi cài đặt các công cụ dev từ các đĩa hệ điều hành là bạn biết các công cụ này sẽ hoạt động với HĐH. Apple là Apple, bạn phải có một phiên bản HĐH gần đây để chạy các trình biên dịch mới nhất và họ luôn không tải xuống các công cụ cũ, vì vậy các đĩa OS thường là cách dễ nhất để tìm các công cụ phù hợp cho một công cụ nhất định dev hoặc hộp kiểm tra.

    Với Lion, họ đang cố gắng loại bỏ phương tiện cài đặt, vì vậy trừ khi bạn mua phiên bản khóa USB đắt tiền, bạn sẽ phải tải xuống Xcode từ App Store .

    Tôi khuyên bạn nên giữ ít nhất một vài phiên bản của bất kỳ DMG Xcode nào bạn tải xuống. Do đó, khi người kế nhiệm của Lion ra mắt một hoặc ba năm, bạn có thể thấy mình không có cách nào để cài đặt phiên bản Xcode đương thời trên máy ảo Lion thử nghiệm. Lập kế hoạch trước trong trường hợp các vấn đề về tính khả dụng và thiếu phương tiện hệ điều hành làm cho các phiên bản Xcode cũ không thể lấy được.


2
+1: đặc biệt để đề cập đến liên kết động. Tôi bị bắt gặp nghĩ rằng nó sẽ rất giống nhau. Niềm vui của install_name và cách trình soạn thảo liên kết động OSX dyld, giải quyết các phụ thuộc!
Troubadour

Về việc giữ các phiên bản MacOS cũ: Tôi sử dụng Parallel để giữ các VM riêng biệt với một phiên bản OS X nhất định nếu tôi muốn kiểm tra khả năng tương thích ngược. Tôi khuyên bạn nên điều này hoặc một công cụ tương tự để thử nghiệm ứng dụng.
ogerard

Đối với các phiên bản cũ của các công cụ dành cho nhà phát triển, hãy kiểm tra connect.apple.com . Tôi vừa kiểm tra và bản tải xuống đầu tiên được liệt kê trong phần Công cụ dành cho nhà phát triển là Xcode 1.0 từ ngày 27 tháng 10 năm 2004 cho OS X 10.3+. Không có ProjectBuilder, nhưng các dự án SOP cho Mac chỉ hỗ trợ các bản phát hành chính hiện tại và trước đây, vì vậy 10.3+ là quá đủ.
Jeremy W. Sherman

@Jeremy: Đã cập nhật. Tôi không muốn đảm bảo với mọi người rằng họ sẽ luôn có thể tải xuống được, vì họ không phải là quá khứ.
Warren Young

29

HUGE GOTCHA - Hệ thống tập tin Mac OS KHÔNG phân biệt chữ hoa chữ thường.


9
Nói rõ hơn, chúng được bảo quản theo trường hợp và không phân biệt chữ hoa chữ thường. Vì vậy, trường hợp tên tệp của bạn sẽ được giữ nguyên, nhưng bạn có thể truy cập nó thông qua bất kỳ biến thể nào của trường hợp. Điều này có thể được thay đổi thành phân biệt chữ hoa chữ thường khi hệ thống tập tin được tạo.
KeithB

9
@KeithB: Tuy nhiên, nhiều ứng dụng Mac chính thống sẽ không chạy trên hệ thống tệp phân biệt chữ hoa chữ thường, ví dụ Adobe CS thậm chí từ chối cài đặt và World of Warcraft sẽ không chạy. Tôi đã bị đốt cháy bởi điều này và cách duy nhất để khôi phục là sao lưu và khôi phục hệ thống của tôi vào một đĩa được định dạng lại.
Neil Mayhew

1
Đây chủ yếu là một gotcha khi xử lý kiểm soát phiên bản và làm việc trên một dự án trong một nhóm đa nền tảng.
Arafangion

Tôi đã tạo ra một thưa thớt trường hợp nhạy cảm để khắc phục điều này. Rất may, tôi có một phân vùng chưa sử dụng trên ổ SSD này.
dhchdhd

9

Mặc dù Fink và MacPorts là phương tiện truyền thống để nhận các gói unix trên OS X, tôi khuyên bạn nên kiểm tra một công cụ mới hơn có tên brewtốt hơn cho hệ thống của tôi và sử dụng ít hơn với hệ thống của tôi và dễ sử dụng hơn nhiều. Về cơ bản, nó chỉ tải tarball và cài đặt vào / usr / local, nhưng nó tự động hóa toàn bộ quá trình rất độc đáo.

http://mxcl.github.com/homebrew/


1
Đã đồng ý; Homebrew đã làm việc rất mượt mà đối với tôi so với MacPorts đã làm.
Jonik

4

HUGE GOTCHA - Hệ thống tập tin Mac OS KHÔNG phân biệt chữ hoa chữ thường.

Bạn có thể tạo hình ảnh đĩa nhạy cho trường hợp trên Mac OS X, có thể được gắn dưới dạng ổ đĩa cứng thông thường.

# cf. http://codesnippets.joyent.com/posts/show/8617
IMAGE="${HOME}/Desktop/Case Sensitive Test.dmg"
VOLNAME="Case Sensitive Test"

hdiutil create "${IMAGE}" -size 10m -fs HFSX -volname "${VOLNAME}" -layout NONE

hdiutil attach "${IMAGE}"

cd "/Volumes/${VOLNAME}"
touch foo.txt Foo.txt
open .
ls -l [Ff]oo.txt
stat -f "inode: %i  --  name: %N" [Ff]oo.txt

cd ~
hdiutil detach "/Volumes/${VOLNAME}"


3

Khi chuyển một ngăn xếp mạng từ Solaris, BSD, Linux và Windows sang OSX, điểm chính duy nhất thu hút sự chú ý là giống như FreeBSD, toàn bộ chuỗi công cụ đã khá cũ.

Apple đang tăng tốc với OSX Lion nhưng Leopard, Snow Leopard khá đứng sau các bản phân phối Linux hiện đại và nhiều tiêu chuẩn không được hỗ trợ. Trong trường hợp của tôi, tôi bị thiếu RFC 3678 (Tiện ích mở rộng giao diện ổ cắm cho bộ lọc nguồn đa phát) khá bất tiện.

Trên máy chủ OSX tôi đã cài đặt một hệ thống tệp phân biệt chữ hoa chữ thường vì nó khuyên bạn nên làm như vậy để phục vụ HTTP.

  • GCC cũ
  • Autoconf cũ, Automake, libtool
  • Không có spinlocks Pthread, OSX cung cấp các lựa chọn thay thế riêng.
  • Không có nhiều API NSS thuê lại.
  • Không quá hữu ích /prochệ thống tập tin.
  • Không /dev/rtc, /dev/hpetRDTSCdường như được gim. OSX cung cấp các lựa chọn thay thế bản địa.
  • Không epoll, nhưng bạn có pollvà kqueue

1

OS X hỗ trợ pthread_cond_timedwaitnhưng nó sử dụng thời gian lịch tuyệt đối và không có cách nào để sử dụng thời gian tăng đơn điệu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.