2009-03-16 4 views
28

Chúng tôi có dự án C++ lớn mà chúng tôi đã sử dụng để biên dịch với nút chuyển đổi/MP để tận dụng nhiều lõi.Thay thế cho #import trong Visual C++

Tuy nhiên, gần đây chúng tôi đã đưa vào một số mã sử dụng #import trên một vài tlb và #import không tương thích với/MP, có nghĩa là chúng tôi quay lại các bản dựng luồng đơn và nhiều thời gian hơn để lấy cà phê.

Bất kỳ đề xuất nào về cách nhận #import và/MP để chơi đẹp? Có một công cụ mà sẽ tĩnh tạo ra các tiêu đề C++ từ một #import như là một bước xây dựng trước?

Cập nhật:

Tiếp theo lời khuyên của Matt làm việc tuyệt vời. Đối với bất cứ ai khác vấp phải này trong google:

  1. tạo một dự án lib tĩnh riêng biệt
  2. thiết lập đủ bao gồm để bạn có thể đặt câu lệnh #import trong dự án lib
  3. thực hiện dự án chính của bạn phụ thuộc vào lib dự án (để đảm bảo chính xác xây dựng theo thứ tự)
  4. thêm tạm thời xây dựng thư mục dự án lib để con đường bao gồm cho dự án chính
  5. #include được tạo ra .tlh file mà bạn đã làm những #import
  6. phép /MP tắc và mất thời gian nghỉ giải lao ...

Trả lời

25

Tại sao không chỉ #include tiêu đề được tạo được tạo từ #import?

+1

Hoàn hảo ... Tôi đã không chú ý đến các tệp 'tlh' trong thư mục đầu ra, nhưng có vẻ như nó chính xác là những gì tôi cần –

+0

Tuyệt vời. Tôi không bao giờ biết điều này! – kizzx2

1

Bạn có thể chia dự án thành hai phần, một phần nhiều hơn hoặc ít hơn việc vô hiệu hóa nhập/MP và một trong đó làm mọi thứ khác cho phép/MP.

2

Một tùy chọn là di chuyển hàng nhập vào một DLL riêng biệt và cung cấp các lớp trình bao bọc cho chúng bằng cách sử dụng một con trỏ mờ. Sau đó, vô hiệu hóa/MP cho rằng chỉ DLL, và phần còn lại của xây dựng của bạn nên được tốt.

+0

Điều đó có hiệu quả, nhưng việc tách các hàng nhập thành một DLL riêng biệt và gói chúng sẽ là rất nhiều nỗ lực. –

+0

Có, nhưng trong quá trình này, bạn sẽ tăng tốc độ xây dựng và tách các thư viện mà bạn đang sử dụng từ việc sử dụng của bạn. – Eclipse

8

(Tôi là một chút muộn để câu hỏi này, nhưng đây là một vấn đề gần gũi với tôi.)

Bạn có thể thử sử dụng theo cách cũ-trường tiếp cận các đối tượng COM từ C/C++ . Điều này liên quan đến các nhà phát triển của các đối tượng COM cung cấp các tệp .h phía máy khách có các phiên bản C/C++ của các giao diện COM. Những tệp này trông giống như các phiên bản đơn giản hơn của những gì #import tạo ra.

Các tệp này đến từ đâu? Nếu các đối tượng COM được viết bằng C/C++ (VC++) so với các đối tượng này đến từ trình biên dịch MIDL. Công cụ dòng lệnh này lấy các tệp ODL/IDL và tạo mã nguồn C/C++ trong số chúng. Một số những gì nó phát ra là hữu ích cho ứng dụng của khách hàng.

Nếu bạn có nguồn của đối tượng COM, bạn có thể đã có những tệp này!

Nếu bạn chỉ có tệp TLB, bạn có thể sử dụng trình xem đối tượng OLE/COM (OLEVIEW.exe - có ít nhất VC++ 6.0) bạn mở thư viện kiểu và lưu-như và tệp OLD/IDL. Sau đó chạy trình biên dịch MIDL để tạo ra các tệp C/C++ phía máy khách bao gồm các tệp. Có một cơ hội mà đối tượng COM bên thứ ba có thể đi kèm với các tệp này, nhưng chúng thường không (tôi nhớ lại Báo cáo tinh thể đã làm trong một thời gian, sau đó ngừng vận chuyển chúng - vặn chúng tôi một cách royally - nhưng tôi digress).

Sử dụng con trỏ thông minh ATL (và các lớp hỗ trợ khác) với các lớp giao diện MIDL tạo ra gần như đẹp như những gì tạo #import. Tùy thuộc vào số lượng # tính năng dành riêng cho nhập khẩu mà bạn sử dụng.

Đối với/MP Tôi đã thực hiện cả những gì tôi đang đề xuất và một số câu trả lời được Matt Davison chấp nhận.

+0

Tôi có các nguồn cho các đối tượng COM, nhưng các tệp tiêu đề được tạo ra bỏ sót các không gian tên và chỉ gói #includes trong các không gian tên không hoạt động. Có cách nào để có được bao gồm tương thích với những gì #import không? –

7

Bạn có thể dùng/MP lựa chọn cho dự án như một toàn thể, và sau đó thực hiện một ngoại lệ cho một tập tin bằng cách sử dụng tùy chọn /MP1.

+0

là điều này thực sự làm việc? –

2

Nếu bạn có thể giới hạn số lượng tệp bạn đang nhập #, bạn có thể đặt chúng trong tệp tiêu đề được biên dịch sẵn (ví dụ: stdafx.h) đã được tự động loại trừ khỏi/MP. Điều này tránh được vấn đề được đề cập, vì tất cả các tệp khác sẽ đợi để trình biên dịch cho đến khi stdafx.cpp được hoàn thành và tất cả sẽ 'kế thừa' cùng một định nghĩa được nhập #.