Mục tiêu-C cho Windows


230

Điều gì sẽ là cách tốt nhất để viết Objective-C trên nền tảng Windows?

Cygwin và gcc? Có cách nào để tôi có thể tích hợp điều này vào Visual Studio không?

Dọc theo những dòng đó - có bất kỳ đề xuất nào về cách liên kết và sử dụng SDK Windows cho một cái gì đó như thế này. Đó là một con quái vật khác nhau nhưng tôi biết tôi có thể viết lắp ráp và liên kết trong Windows DLL cho tôi khả năng truy cập vào các cuộc gọi đó nhưng tôi không biết làm thế nào để thực hiện điều này mà không cần thông báo và nhận chỉ dẫn từng phần.

Có ai biết về một nguồn tài nguyên trực tuyến hoặc sách tốt để làm hoặc giải thích những loại điều này không?


5
Nếu bạn chỉ đang làm điều đó cho iOS, bạn có thể sử dụng Môi trường xây dựng iOS của PM Baty ...
Cole Johnson

Câu trả lời:


146

Mở rộng trên hai câu trả lời trước, nếu bạn chỉ muốn Objective-C nhưng không phải bất kỳ khung công tác Cacao nào, thì gcc sẽ hoạt động trên bất kỳ nền tảng nào. Bạn có thể sử dụng nó thông qua Cygwin hoặc nhận MinGW. Tuy nhiên, nếu bạn muốn các khung Cacao hoặc ít nhất là một tập hợp con hợp lý của chúng, thì GNUStep và Cocotron là các cược tốt nhất của bạn.

Cocotron triển khai rất nhiều thứ mà GNUStep không có, chẳng hạn như CoreGraphics và CoreData, mặc dù tôi không thể đảm bảo việc thực hiện chúng hoàn thành như thế nào trên một khung cụ thể. Mục đích của họ là giữ cho Cocotron cập nhật phiên bản OS X mới nhất để mọi chương trình OS X khả thi có thể chạy trên Windows. Do GNUStep thường sử dụng phiên bản gcc mới nhất, nên họ cũng hỗ trợ thêm cho Objective-C ++ và rất nhiều tính năng của Objective-C 2.0.

Tôi chưa thử nghiệm các tính năng đó với GNUStep, nhưng nếu bạn sử dụng phiên bản gcc hoàn toàn mới, bạn có thể sử dụng chúng. Tôi đã không thể sử dụng Objective-C ++ với GNUStep vài năm trước. Tuy nhiên, GNUStep không biên dịch từ bất kỳ nền tảng nào. Cocotron là một dự án rất trung tâm. Mặc dù có thể biên dịch nó trên các nền tảng khác, nhưng nó có các tệp dự án XCode, không phải tệp tạo tệp, vì vậy bạn chỉ có thể biên dịch các khung của nó ra khỏi hộp trên OS X. Nó cũng đi kèm với các hướng dẫn về biên dịch ứng dụng Windows trên XCode, nhưng không phải bất kỳ nền tảng khác. Về cơ bản, có thể thiết lập môi trường phát triển Windows cho Cocotron, nhưng không dễ như thiết lập một cho GNUStep, và bạn sẽ tự mình làm được, vì vậy, GNUStep chắc chắn là cách tốt nhất nếu bạn phát triển Windows trái ngược với chỉ dành cho Windows.

Đối với giá trị của nó, Cocotron được cấp phép theo giấy phép MIT và GNUStep được cấp phép theo LGPL.


1
Bạn luôn có thể chuyển các framworks ca cao là nguồn mở. Ví dụ là CoreFoundation.
Cole Johnson

Không phải tất cả các nguồn mở Core Foundation IS. Một lượng lớn là nguồn đóng.
uchuugaka

X'D Tôi không biết tại sao anh chàng này có câu trả lời hay nhất mà anh ta thậm chí không thử những thứ anh ta nói. Họ nên làm một huy hiệu mới cho câu trả lời của bs. Không xúc phạm @michael. Đó là một bài đọc thú vị.
Wolfpack'08

Không có hành vi phạm tội, nhưng đối với hồ sơ, tại thời điểm tôi viết câu trả lời này, tôi đã phải vật lộn trong vài tuần để biên dịch Objective-C cho Windows, và đã thử dùng cả GNUStep và Cocoatron. Cuối cùng tôi đã buộc phải viết lại dự án trong C ++, do một số lỗi trình biên dịch tại thời điểm đó và ivars không được khởi tạo thành 0 trên Windows. Tôi đã tham khảo "Tôi chưa thử nghiệm các tính năng đó", nhưng tôi đã nói về các tính năng Objective-C 2.0 mới, vốn chỉ có trên các nền tảng của Apple trong chưa đầy một năm khi câu trả lời này được viết và vừa hạ cánh ở GNUStep.
Michael Buckley

89

Bạn có thể sử dụng Objective C bên trong môi trường Windows. Nếu bạn làm theo các bước này, nó sẽ hoạt động tốt:

  1. Truy cập trang web GNUstep và tải xuống GNUstep MSYS Subsystem(MSYS cho GNUstep), GNUstep Core(Thư viện cho GNUstep) vàGNUstep Devel
  2. Sau khi tải xuống các tệp này, hãy cài đặt theo thứ tự đó hoặc bạn sẽ gặp vấn đề với cấu hình
  3. Điều hướng đến C:\GNUstep\GNUstep\System\Library\Headers\Foundation1 và đảm bảo rằng Foundation.htồn tại
  4. Mở một dấu nhắc lệnh và chạy gcc -vđể kiểm tra xem đã GNUstep MSYSđược cài đặt đúng chưa (nếu bạn gặp lỗi không tìm thấy tệp, hãy đảm bảo rằng binthư mục GNUstep MSYSnằm trong của bạn PATH)
  5. Sử dụng chương trình "Hello World" đơn giản này để kiểm tra chức năng của GNUstep:

    #include <Foundation/Foundation.h>
    
    int main(void)
    {
        NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
        NSLog(@"Hello World!.");
        [pool drain];
     return;
    }
    
  6. Quay trở lại dấu nhắc lệnh và cdđến nơi bạn đã lưu chương trình "Hello World" và sau đó biên dịch nó: 2

    gcc -o helloworld.exe <HELLOWORLD>.m -I /GNUstep/GNUstep/System/Library/Headers -L /GNUstep/GNUstep/System/Library/Libraries -std=c99 -lobjc -lgnustep-base -fconstant-string-class=NSConstantString
  7. Cuối cùng, từ dấu nhắc lệnh, gõ helloworldđể chạy nó

Chúc các bạn thành công và vui vẻ với Objective-C!


GHI CHÚ :

  1. Tôi đã sử dụng đường dẫn cài đặt mặc định - điều chỉnh dòng lệnh của bạn cho phù hợp
  2. Đảm bảo đường dẫn thư mục của bạn giống với của tôi, nếu không bạn sẽ gặp lỗi

1
Cài đặt được đề xuất này không hoạt động trên PC của tôi vì tôi đã cài đặt gcc mà tôi đã sử dụng cho nasm. Vì vậy, tôi chỉ cần điều chỉnh gcc -o helloworld...đến c:\gnustep\bin\gcc -o helloworld...và nó làm việc. Giải pháp thay thế sẽ là sửa đổi các Biến môi trường mà tôi đã không làm vì tôi chỉ nhìn thấy Mục tiêu C. Cảm ơn teshguru cho đến câu trả lời.
Martin Berger

Xem xét loại bỏ định dạng mã xung quanh tên của sự vật. GNUstep MYSY không phải là mã, nó chỉ là tên của một phần mềm. Nếu bạn muốn một cái gì đó nổi bật, có thể xem xét đắp nó? Và nếu một cái gì đó kết nối với một thẻ, hãy xem xét sử dụng các dấu phân cách thẻ, nhưng không nên có bất kỳ lý do nào để đặt tên thích hợp trong việc xóa thẻ.
Wolfpack'08

khi được sử dụng ch \ cn \ \ \ \ \ lgnustep-base -fconstant-string-class = NSConstantString nó hoạt động linh hoạt với tôi
Dalvik

13

Cũng thế:

Cocotron là một dự án nguồn mở nhằm thực hiện API Objective-C đa nền tảng tương tự như mô tả trong tài liệu Cacao của Apple Inc. Điều này bao gồm các API hỗ trợ và thời gian chạy AppKit, Foundation, Objective-C như CoreGraphics và CoreFoundation.

http://www.cocotron.org/


4
Dự án Cocotron được thiết kế để được biên dịch chéo từ XCode, không được viết trên Windows và được biên dịch ở đó.
Dan Udey

2
Đây không phải là một câu trả lời hay, tôi thậm chí không chắc tại sao OP chọn đây là 'câu trả lời' vì CoCotron dành cho Mac và OP muốn có giải pháp dựa trên Windows.
cbrulak

Bạn đã đúng - Tôi đã có một chút quá phấn khích khi đọc điều này: "Mục tiêu chung là cung cấp hỗ trợ đầy đủ trên bất kỳ nền tảng khả thi nào, dự án dự định là khả năng di động nhất có thể. Tuy nhiên, hầu hết công việc tại thời điểm này là tập trung vào việc cung cấp hỗ trợ cho Microsoft Windows. Đặc biệt là các phiên bản dựa trên NT, 2000 cho đến Vista. "
Luther Baker

13

WinObjC? Windows Bridge cho iOS (trước đây gọi là 'Project Islandwood').

Windows Bridge cho iOS (còn được gọi là WinObjC) là một dự án nguồn mở của Microsoft cung cấp môi trường phát triển Objective-C cho Visual Studio / Windows. Ngoài ra, WinObjC cung cấp hỗ trợ cho khả năng tương thích API của iOS. Mặc dù bản phát hành cuối cùng sẽ diễn ra vào cuối mùa thu này (cho phép cây cầu tận dụng các khả năng công cụ mới sẽ được phát hành với Bản cập nhật Visual Studio 2015 sắp tới),

Cây cầu hiện có sẵn cho cộng đồng nguồn mở ở trạng thái hiện tại. Giữa bây giờ và mùa thu. Cầu nối iOS như một dự án nguồn mở theo giấy phép MIT. Đưa ra tham vọng của dự án, giúp các nhà phát triển iOS dễ dàng xây dựng và chạy các ứng dụng trên Windows.

Salmaan Ahmed có một bài viết chuyên sâu về Windows Bridge cho iOS http://bloss.windows.com/buildingapps/2015/08/06/windows-bridge-for-ios-lets-open-this-up/ thảo luận về trình biên dịch, thời gian chạy, tích hợp IDE và cầu nối là gì và không. Tuyệt vời nhất, mã nguồn cho cầu iOS hiện đang có trên GitHub.

Cầu iOS hỗ trợ cả ứng dụng Windows 8.1 và Windows 10 được xây dựng cho kiến ​​trúc bộ xử lý x86 và x64, và chúng tôi sẽ sớm bổ sung tối ưu hóa trình biên dịch và hỗ trợ cho ARM, bổ sung hỗ trợ di động.


9

Tôi có cảm xúc lẫn lộn về dự án Cocotron. Tôi rất vui vì họ đang phát hành mã nguồn và chia sẻ nhưng tôi không cảm thấy rằng họ đang làm mọi thứ một cách dễ dàng nhất.

Ví dụ.
Apple đã phát hành mã nguồn cho thời gian chạy object-c , bao gồm các thuộc tính và bộ sưu tập rác. Tuy nhiên, dự án Cocotron có triển khai riêng của thời gian chạy mục tiêu-c. Tại sao phải nhân đôi nỗ lực? Thậm chí còn có một tệp Visual Studio Project có thể được sử dụng để xây dựng tệp objc.dll. Hoặc nếu bạn thực sự lười biếng, bạn chỉ có thể sao chép tệp DLL từ bản cài đặt Safari trên Windows.

Họ cũng không thèm tận dụng CoreFoundation, vốn cũng được Apple mở nguồn. Tôi đã đăng một câu hỏi về điều này nhưng không nhận được câu trả lời.

Tôi nghĩ rằng giải pháp tốt nhất hiện tại là lấy mã nguồn từ nhiều nguồn (Apple, CocoTron, GnuStep) và hợp nhất nó với những gì bạn cần. Bạn sẽ phải đọc rất nhiều nguồn nhưng nó sẽ có giá trị kết quả cuối cùng.


2
Xin lỗi về việc không trả lời câu hỏi của bạn trong nhóm, để tóm tắt: APSL hút và cả thời gian chạy và CF đều nằm dưới chúng.
Christopher Lloyd

1
Điều gì hấp dẫn về APSL? ( opensource.apple.com/license/apsl ) Nó không xâm lấn như GPL. Nếu bạn sửa đổi mã được bảo hiểm thì bạn phải làm cho mã đó có sẵn. Mã được bảo hiểm sẽ là bất kỳ sửa đổi nào bạn thực hiện cho CoreFoundation chẳng hạn, nhưng sẽ không bao gồm chương trình thực tế của bạn. Bạn cũng cần đánh dấu rõ ràng sửa đổi của bạn. Điều này thật phiền toái nhưng đáng để đánh đổi bằng cách sử dụng mã được thử nghiệm cao của Apple phải không?
Matthieu Cormier

8
Tôi không nghĩ bạn hiểu cách thức chấm dứt hoạt động, đó không phải là điều họ có thể làm cho tất cả mọi người cùng một lúc, mã được cấp phép theo các điều khoản và có thể sử dụng theo các điều khoản đó vô thời hạn. Điều có thể xảy ra là Apple có thể chọn ra những cá nhân / công ty mà họ cho là đã vi phạm giấy phép. FSF đã thực hiện điều này với các vi phạm GPL, bạn có thực sự nghĩ rằng Apple thân thiện với các nhà phát triển hơn so với FSF không? Nếu bạn nghĩ rằng các điều khoản này không quan trọng và vô nghĩa, tôi chắc chắn bạn có thể thuyết phục Apple hợp pháp để loại bỏ chúng.
Christopher Lloyd

8
Cần lưu ý rằng Apple đã làm việc với FSF về các thay đổi đối với APSL và rằng FSF coi APSL Phiên bản 2.0 là giấy phép phần mềm miễn phí. gnu.org/philatics/apsl.html
Sean

3
Từ quan điểm của tôi (như một người đã giao dịch với BSD, LGPL, MIT và các giấy phép khác trong một sản phẩm độc quyền) Giấy phép của Apple bị hạn chế hơn so với GPL - điều thực sự là một nỗi đau ở mông. Nếu tôi có thể nhận BSD, MIT hoặc APSL, tôi muốn làm việc với những người đó hơn GPL.
Lloyd Sargent

8

Tôi biết đây là một bài viết rất cũ, nhưng tôi đã tìm thấy một giải pháp chỉ mới xuất hiện gần đây VÀ cho phép gần như tất cả các tính năng của Objective-C 2.0 trên nền tảng Windows.

Với sự ra đời của gcc 4.6, hỗ trợ cho các tính năng ngôn ngữ Objective-C 2.0 (khối, cú pháp dấu chấm, thuộc tính tổng hợp, v.v.) đã được thêm vào trình biên dịch Objective-C (xem ghi chú phát hành để biết chi tiết đầy đủ). Thời gian chạy của họ cũng đã được cập nhật để hoạt động gần như giống hệt với thời gian chạy Objective-C 2.0 của chính Apple. Nói tóm lại, điều này có nghĩa là (gần như) bất kỳ chương trình nào sẽ biên dịch hợp pháp với Clang trên máy Mac cũng sẽ biên dịch với gcc 4.6 mà không cần sửa đổi.

Như một lưu ý phụ, một tính năng không khả dụng là từ điển / mảng / vv vì tất cả chúng đều được mã hóa cứng vào Clang để sử dụng các lớp NSDipedia, NSArray, NSNumber, v.v. của Apple.

Tuy nhiên, nếu bạn hạnh phúc khi sống mà không có khuôn khổ rộng lớn của Apple, bạn có thể. Như đã lưu ý trong các câu trả lời khác, GNUStep và Cocotron cung cấp các phiên bản sửa đổi của thư viện lớp của Apple hoặc bạn có thể tự viết (tùy chọn ưa thích của tôi).

MinGW là một cách để có GCC 4.6 trên nền tảng Windows và có thể được tải xuống từ trang web của MinGW . Đảm bảo khi bạn cài đặt, bạn bao gồm cài đặt C, C ++, Objective-C và Objective-C ++. Trong khi tùy chọn, tôi cũng sẽ đề nghị cài đặt môi trường MSYS.

Sau khi cài đặt, nguồn Objective-C 2.0 có thể được biên dịch với:

gcc MyFile.m -lobjc -std=c99 -fobjc-exceptions -fconstant-string-class=clsname (etc, additional flags, see documentation)

MinGW cũng bao gồm hỗ trợ biên dịch các ứng dụng GUI Windows gốc với -mwindowscờ. Ví dụ:

g++ -mwindows MyFile.cpp

Tôi chưa thử, nhưng tôi tưởng tượng nếu bạn bọc các lớp Objective-C của mình trong Objective-C ++ ở lớp cao nhất có thể, bạn sẽ có thể kết hợp thành công tất cả Windows GUI C ++ và Objective-C trong một Ứng dụng Windows.



6

Nếu bạn chỉ muốn thử nghiệm, có một trình biên dịch Objective-C cho .NET (Windows) tại đây: qckapp


chương trình này không thể biên dịch với osc. NSLog (@ Thử nghiệm ... \ n..1 \ n ... 2 \ n .... 3 đá); [cống hồ bơi]; trả về 0; }
KIRAN KJ

5

Bạn có thể nhận được một trình biên dịch mục tiêu c sẽ hoạt động với Windows và chơi tốt với Visual Studio 2008 \ 2010 tại đây.

open-c flite

Chỉ cần tải về nguồn mới nhất. Bạn không cần phải xây dựng tất cả CF-Lite, có một giải pháp gọi là objc.sln. Bạn sẽ cần sửa một vài trong số các đường dẫn bao gồm nhưng sau đó nó sẽ xây dựng tốt. Thậm chí còn có một dự án thử nghiệm bao gồm để bạn có thể thấy một số tệp mục tiêu-c .m đang được biên dịch và làm việc trong phòng thu trực quan. Một điều đáng buồn là nó chỉ hoạt động với Win32 chứ không phải x64. Có một số mã lắp ráp sẽ cần phải được viết cho x64 để hỗ trợ nó.


Tôi đã tải xuống và chạy dự án này bằng Visual Studio 2013 và tôi đã nhận được 30 trường hợp lỗi này. Lỗi 64 lỗi C2632: 'char' theo sau là 'bool' là bất hợp pháp C: \ opencflite-code-248-trunk \ bao gồm \ c99 \ stdbool.h 20 1 objc
Adam Mendoza

4

Một nỗ lực gần đây để chuyển Objective C 2.0 sang Windows là dự án Chủ quan .

Từ Readme:

Chủ quan là một nỗ lực để mang Objective C 2.0 có hỗ trợ ARC cho Windows.

Dự án này là một nhánh của objc4-532.2, thời gian chạy Objective C đi kèm với OS X 10.8.5. Cổng có thể được biên dịch chéo trên OS X bằng cách sử dụng llvm-clang kết hợp với trình liên kết MinGW.

Có một số hạn chế nhất định trong đó có vấn đề là việc làm thêm, trong khi những hạn chế khác, chẳng hạn như ngoại lệ và khối, phụ thuộc vào công việc nghiêm túc hơn trong các dự án của bên thứ 3. Những hạn chế là:

• Chỉ 32 bit - Đang thực hiện 64 bit

• Chỉ liên kết tĩnh - liên kết động đang được tiến hành

• Không đóng / chặn - cho đến khi libdispatch hỗ trợ chúng trên Windows

• Không có ngoại lệ - cho đến khi clang hỗ trợ chúng trên Windows

• Không có kiểu cũ - cho đến khi ai đó quan tâm ...

• Nội bộ: không có vtables, không hỗ trợ gdb, chỉ là malloc đơn giản, không có tiền xử lý - một số trong những thứ này sẽ có sẵn trong bản dựng 64 bit.

• Hiện tại cần một trình biên dịch clang vá; Bản vá thêm cờ -fobjc-runtime = subj

Dự án có sẵn trên Github và cũng có một chủ đề trong Nhóm Cocotron nêu ra một số tiến trình và các vấn đề gặp phải.



0

Nếu bạn cảm thấy thoải mái với môi trường Visual Studio,

Dự án nhỏ: jGRASP với gcc Dự án lớn: Cocotron

Tôi nghe nói có các trình giả lập, nhưng tôi chỉ có thể tìm thấy Trình giả lập Apple II http://virtualapple.org/ . Có vẻ như giới hạn trong các trò chơi.


0

Trước hết, hãy quên các công cụ GNUStep . Cả ProjectManagerProjectCenter đều không thể được gọi là IDE. Với tất cả sự tôn trọng, có vẻ như những kẻ trong dự án GNUStep bị mắc kẹt vào cuối những năm 80 (đó là khi NeXTSTEP lần đầu tiên xuất hiện).

Vim

ctagshỗ trợ Objective-C kể từ r771 (hãy chắc chắn chọn phiên bản 5.9 phát hành trước và thêm --langmap=ObjectiveC:.m.hvào dòng lệnh, xem tại đây ), vì vậy bạn sẽ có điều hướng thẻ / hoàn thành mã tốt.

Dưới đây là một đoạn ngắn howto về việc bổ sung hỗ trợ Objective-C để Vim tagbar plugin.

Emacs

Điều tương tự cũng áp dụng cho etagsvận chuyển với Emacsen hiện đại, vì vậy bạn có thể bắt đầu với Chế độ mục tiêu C của Emacs . YASnippet sẽ cung cấp các mẫu hữu ích:

Chế độ objc của YASnippet

và nếu bạn muốn một cái gì đó thông minh hơn việc hoàn thành mã dựa trên thẻ cơ bản , hãy xem câu hỏi này .

Nhật thực

CDT hỗ trợ Makefilecác dự án dựa trên:

nhập mô tả hình ảnh ở đây

- về mặt kỹ thuật, bạn có thể xây dựng các dự án Objective-C của mình ngay lập tức (trên Windows, bạn sẽ cần chuỗi công cụ Cygwin hoặc MinGW ). Vấn đề duy nhất là trình soạn thảo mã sẽ báo cáo nhiều lỗi so với những gì nó nghĩ là mã C thuần túy (việc kiểm tra mã nhanh chóng có thể bị tắt, nhưng vẫn ...). Nếu bạn muốn làm nổi bật cú pháp thích hợp, bạn có thể thêm Eclim vào Eclipse của mình và tận hưởng tất cả các tính năng tốt của cả EclipseVim (xem bên trên).

Một plugin Eclipse đầy hứa hẹn khác là Colorer , nhưng nó chưa hỗ trợ Objective-C. Vui lòng gửi một yêu cầu tính năng mặc dù.

SlickEdit

SlickEdit , trong số các tính năng khác của IDE tuyệt vời, không hỗ trợ Objective-C. Mặc dù nó khá phức tạp để học (mặc dù không phức tạp như Emacs), tôi tin rằng đây là lựa chọn tốt nhất của bạn với điều kiện bạn không ngại mua nó (giá cả khá phải chăng).

Ngoài ra, nó có một plugin Eclipse có thể được sử dụng thay thế cho trình soạn thảo độc lập.

Phát triển

Có tin đồn rằng nó tồn tại một bản vá KDevelop (15 tuổi, nhưng ai quan tâm?). Cá nhân tôi không nghĩ rằng KDevelop vượt trội so với Emacsen , vì vậy tôi sẽ không thử dùng nó.


Những điều trên cũng áp dụng cho phát triển Objective-C trên Linux, vì tất cả các công cụ được đề cập đều có khả năng di động ít nhiề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.