2010-01-15 57 views
35

Tôi đang cố tạo một dự án C# trong một cơ sở mã C++ CMake hiện có trên Windows. Sau một số nghiên cứu, tôi chỉ có thể tìm thấy hai dự án đã xây dựng trình biên dịch CSharp của riêng mình cho CMake: gdcmkde.Tạo dự án C# bằng CMake

Tôi đã thử cả hai. Thật không may, người đầu tiên không tạo được dự án C#. Thay vào đó nó tạo ra một dự án VS C++ với các tệp cs trong đó, và vì các cờ C++ được đặt cho trình liên kết, việc xây dựng luôn thất bại với các lỗi. Sau khi thử nghiệm với dự án mẫu mà họ đã cung cấp, tôi tự hỏi liệu điều này có thể là do giới hạn của trình tạo mã "Visual Studio 8 2005" không?

Dự án thứ hai chủ yếu nhằm vào Mono, vì vậy tôi cũng không thành công với dự án này.

Có ai có kinh nghiệm tích cực với việc xây dựng các dự án C# sử dụng một trong những mô-đun CMake hoặc một thứ khác không?

Trả lời

1

Cuối cùng tôi đã có thể tạo ra một giải pháp hợp lệ bằng cách sử dụng C# module - kde thứ hai. Mặc dù, cmake đã tạo một số tệp .vcproj trong khi tôi dự kiến ​​nhận được .csproj, nhưng tôi đoán đó là biểu mẫu duy nhất "Visual Studio 8 2005" có thể cung cấp.

Tuy nhiên tôi đã có thể xây dựng thành công giải pháp này và tạo các thư viện thi hành và thư viện dll.

+0

Cập nhật: thực tế là cmake tạo ra c + + dự án với C# nguồn tập tin trong họ làm cho dự án gần như không sử dụng được - Intellisense không hoạt động, app.config không thể được truy cập thông qua các phương tiện thông thường, vv tôi ngừng tiếp tục điều tra theo hướng này và chuyển sang cấu hình dự án dựa trên MsBuild. – Leonid

21

Chỉ trong trường hợp bất kỳ ai vẫn đang tìm kiếm thông tin về điều này, thực sự không có lý do gì để tạo các dự án C# với CMake, chúng là nền tảng chéo theo thiết kế. Trên Linux, các dự án C# thường được quản lý với MonoDevelop có thể đọc các tệp .csproj từ studio trực quan tốt. Điều này sẽ cho phép phát triển đa nền tảng của các dự án C#. Vấn đề duy nhất có thể là nếu bạn có dự án gốc C++ được trộn lẫn với các dự án C# (giống như một chương trình phụ được viết bằng C++ với GUI trong C#), trong trường hợp này chỉ cần sao chép cmake trên tệp .csproj của bạn như thể chúng là dữ liệu và bạn nên được tốt để đi. CMake được thiết kế để xây dựng môi trường xây dựng của bạn thành nền tảng chéo. Điều này thực sự hữu ích với C++ nơi mã được xây dựng theo một cách rất khác trên linux so với trên các cửa sổ (hoặc các hệ điều hành khác nếu bạn muốn), nhưng không cần thiết cho C# có thể thực thi nền tảng chéo, và nhờ thiết kế quyết định của nhóm đơn sắc, có thể xây dựng nền tảng chéo. CMake cung cấp một số công cụ tuyệt vời để tự động hóa mọi thứ, nhưng phần lớn chức năng này có thể được phục hồi với tệp .csproj được định cấu hình đúng. Dù sao tôi biết câu hỏi này đã hơn một tuổi nhưng đó là một trong những kết quả tìm kiếm hàng đầu mà tôi tình cờ gặp phải khi tôi đang tìm cách làm điều này. Tôi đã thực hiện điều này.

+3

Có, nhưng trong khi cmake cũng cung cấp chức năng cài đặt đồng bằng C# dự án (csproj) thì không.Tôi muốn được quan tâm đến chức năng "make && make install" cho các dự án C# nếu cmake có thể cung cấp nó. – fog

+0

Không khó để thiết lập sự kiện xây dựng bài đăng cho sự kiện này. Giả sử bạn cần tích hợp vào một hệ thống xây dựng cmake hiện có, thậm chí bạn có thể sử dụng lệnh cmake configure_file để điền vào vị trí cài đặt chính xác. –

+24

Có một lý do chính đáng để tạo các dự án C# bởi CMake. Nếu bạn có dự án C + +/CLI + C# với nhiều cấu hình được thực hiện bởi CMake, bạn cần dự án C# để thực hiện cấu hình trong CMake và tham khảo các dự án được tạo cho C++ và đưa vào giải pháp đúng. –

1

Bạn có thể tạo dự án bằng Visual Studio, ngoài việc tách rời và làm cho CMake viết nó bằng lệnh configure_file (bạn sẽ phải tạo một chút XML với danh sách nguồn) và thêm nó vào giải pháp với include_external_msproject (đối với các máy phát điện khác, bạn sẽ cần tạo mục tiêu tùy chỉnh để chạy msbuild trên nó theo cách thủ công; cmake dường như không hỗ trợ làm điều đó). Dự án khá đơn giản, nên có thể làm được điều đó.

24

CMake 2.8.9 và lên thêm một tham số TYPE-include_external_msproject như vậy:

include_external_msproject(
    MyProject MyProject.csproj 
    TYPE FAE04EC0-301F-11D3-BF4B-00C04F79EFBC) 

này cho phép bạn xác định rằng dự án là C# (sự kỳ diệu GUID trên), nếu không điều chiến đấu (see docs).

Bạn có thể vẫn muốn sử dụng phương pháp tiếp cận mẫu configure_file được đề cập ở nơi khác với tệp .csproj để có đường dẫn đúng vào đó, trừ khi bạn đang xây dựng thẳng vào cây nguồn của mình.

Tin tốt là bạn có thể ký tự đại diện các file C# của bạn trong file .csproj.template như vậy:

<ItemGroup> 
    <Compile Include="${DOS_STYLE_SOURCE_DIR}\**\*.cs" /> 
</ItemGroup> 

Và bạn sẽ cần một cái gì đó như thế này trong CMakeLists.txt của bạn để chuyển đổi unix-style tách đường forwardslash CMake của thành backslashes windows-phong cách, nếu không nó sẽ biên dịch các tập tin nhưng họ sẽ không hiển thị như các liên kết trong các dự án trong Visual Studio:

FILE(TO_NATIVE_PATH "${CMAKE_CURRENT_SOURCE_DIR}" DOS_STYLE_SOURCE_DIR) 

Sau đó, nó chỉ là:

CONFIGURE_FILE(MyProject.csproj.template MyProject.csproj) 

Trong số CMakeLists.txt để định cấu hình tệp mẫu thành tệp dự án thực với đường dẫn ký tự đại diện phù hợp.

HTH.

+1

Bạn có thể đưa ra một ví dụ hoàn chỉnh (hoặc liên kết đến một) về cách: (1) Sao chép thư mục và tệp C# nguồn; (2) tệp .csproj.template và cách sử dụng nó; và (3) cách cập nhật CMakeLists.txt để làm tất cả điều này? –

+3

Bạn không cần sao chép thư mục/tệp nguồn C# - chúng được tham chiếu tại chỗ. Tệp csproj.template giống với bất kỳ tệp csproj nào khác, ngoại trừ ký tự đại diện được ghi chú ở trên. Chỉ cần sao chép một. Tôi đã thêm lệnh CONFIGURE_FILE thực sự vào câu trả lời của tôi, đó là điều duy nhất còn thiếu. –

+0

Tôi có cần thêm CMakeLists.txt trong thư mục C# của mình hoặc thực hiện tất cả những thay đổi này trong thư mục gốc CMakeLists.txt không? Nếu chúng xảy ra trong thư mục gốc CMakeLists.txt, tôi có đặt chúng trước hoặc sau khi gọi hàm include_external_msproject() không? –

16

Kể từ CMake 3.8.2, thế hệ dự án CSharp được CMake hỗ trợ chính thức.

Để xây dựng dự án C#/WPF mặc định của Visual Studio 2017 được tạo bằng CMake, hãy tạo tệp CMakeList.txt như sau.

  • Tuyên bố dự án

    project(Example VERSION 0.1.0 LANGUAGES CSharp) 
    
  • Bao gồm CMake CSharpUtilities nếu bạn đang có kế hoạch về việc sử dụng WPF hoặc tài sản nhà thiết kế khác.

    include(CSharpUtilities) 
    
  • Thêm tất cả cs, xaml, settings, properties

    add_executable(Example 
        App.config 
        App.xaml 
        App.xaml.cs 
        MainWindow.xaml 
        MainWindow.xaml.cs 
    
        Properties/AssemblyInfo.cs 
        Properties/Resources.Designer.cs 
        Properties/Resources.resx 
        Properties/Settings.Designer.cs 
        Properties/Settings.settings) 
    
  • file liên kết được thiết kế riêng, xaml tác phẩm, và các tập tin thuộc tính khác với họ tương ứng cs file

    csharp_set_designer_cs_properties(
        Properties/AssemblyInfo.cs 
        Properties/Resources.Designer.cs 
        Properties/Resources.resx 
        Properties/Settings.Designer.cs 
        Properties/Settings.settings) 
    
    csharp_set_xaml_cs_properties(
        App.xaml 
        App.xaml.cs 
        MainWindow.xaml 
        MainWindow.xaml.cs) 
    
  • Set ứng dụng App.xaml thuộc tính tập tin như điểm vào chương trình (nếu dự án là một dự án WPF)

    set_property(SOURCE App.xaml PROPERTY VS_XAML_TYPE "ApplicationDefinition") 
    
  • Đặt cờ csproj tập tin khác

    set_property(TARGET Example PROPERTY VS_DOTNET_TARGET_FRAMEWORK_VERSION "v4.6.1") 
    set_property(TARGET Example PROPERTY WIN32_EXECUTABLE TRUE) 
    ... 
    
  • Thêm thư viện

    set_property(TARGET Example PROPERTY VS_DOTNET_REFERENCES 
        "Microsoft.CSharp" 
        "PresentationCore" 
        "PresentationFramework" 
        "System" 
        "System.Core" 
        "System.Data" 
        "System.Data.DataSetExtensions" 
        "System.Net.Http" 
        "System.Xaml" 
        "System.Xml" 
        "System.Xml.Linq" 
        "WindowsBase") 
    

Đối với một ví dụ làm việc, xem https://github.com/bemehiser/cmake_csharp_wpf_example

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