2014-10-09 19 views
18

Một số dự án trong giải pháp của tôi tạo ra cảnh báo mối liên kết này:Điều gì gây ra cảnh báo liên kết "MSIL .netmodule hoặc mô-đun được biên dịch với/GL được tìm thấy; khởi động lại liên kết với/LTCG"?

MSIL .netmodule or module compiled with /GL found; restarting link with /LTCG; add /LTCG to the link command line to improve linker performance 

Tôi đang sử dụng Visual Studio 2013 Update 3. Tôi vẫn chưa thể xác định được bất cứ điều gì đặc biệt đối với những dự án mà có thể gây ra điều này.

Điều gì về các dự án tạo ra điều này?


tôi đã xem xét điều này: http://msdn.microsoft.com/en-us/library/k669k83h.aspx nhưng tôi không biết chúng tôi đang sử dụng bất kỳ CLR, quản lý mã,/LN hoặc/NOASSEMBLY.

+4

quả cầu pha lê của tôi nói rằng bạn đang nhận được cảnh báo này trong Debug xây dựng của dự án của bạn từ liên kết một tệp .lib tĩnh được tạo bằng cài đặt cấu hình Phát hành. Đã bật/GL theo mặc định. Đó thường là tin tức khá xấu ngoài cảnh báo này, YMMV. –

Trả lời

12

Tôi đã gặp phải lỗi tương tự và đã dành khá nhiều thời gian để sửa nó. Cuối cùng, tôi đã tìm ra rằng nó xuất hiện do việc sử dụng tùy chọn "Tối ưu hóa toàn bộ chương trình" ở một trong các thư viện phụ thuộc của tôi.

Theo mặc định, tùy chọn này được đặt thành "Có" trong các dự án mới được tạo. Khi tôi đổi thành "Không" và biên dịch lại tất cả các phụ thuộc, cảnh báo biến mất. Tôi hoàn toàn có nguồn gốc C++ giải pháp mà không có bất kỳ mã được quản lý.

Để khắc phục, thiết lập dự án mở của tất cả các dự án phụ thuộc và kiểm tra thiết lập:

Configuration Properties> C/C++> Tối ưu hóa> Tối ưu hóa Chương trình Tổng

Hãy chắc chắn rằng nó được thiết lập để "Không" ở khắp mọi nơi.

+1

Không hoàn toàn. Trong khi điều này làm cho cảnh báo biến mất, nó cũng vô hiệu hóa một số tối ưu hóa. Tốt hơn là bật cài đặt "Liên kết mã thời gian thế hệ". –

+1

Cài đặt "Liên kết mã thời gian thế hệ" là một lựa chọn tốt hơn. Tuy nhiên, nó không phải luôn luôn thuận tiện vì nó không phải là một thiết lập mặc định. Hãy tưởng tượng rằng bạn cung cấp một thư viện cho một đối tượng rộng. Bạn phải viết sau đó một hướng dẫn về điều chỉnh các thiết lập trong mỗi dự án kết thúc tiêu thụ thư viện. Người dùng tiềm năng của thư viện có thể phát triển đáng ngờ và chỉ cần chọn không sử dụng nó trong các dự án của họ. Thay đổi thiết lập trong các tùy chọn C++ làm tổn hại đến hiệu quả nhưng cho phép đạt được khả năng tương thích với các giá trị mặc định. Kịch bản nào để chọn mọi người nên quyết định riêng tùy thuộc vào hoàn cảnh cụ thể. –

+0

Erm, "Liên kết mã thời gian thế hệ" là mặc định trong bản dựng bản phát hành - nếu không sẽ không có ý nghĩa gì khi có "Toàn bộ chương trình tối ưu hóa" làm mặc định. –

2

tôi tìm ra lỗi tương tự biến mất bằng cách nói với các mối liên kết về/GL thiết lập mà bạn đã sử dụng:

Set ... Configuration Properties/Linker/Tối ưu hóa/Link Time Code Generation Để ... Một của cài đặt không phải Mặc định

Có thể sử dụng một số ứng dụng https://msdn.microsoft.com/en-us/library/xbf3tbeh.aspx?

Neil

0

Thông báo này hiển thị rất nhiều, điều này thực sự gây ra sự nghi ngờ. Tôi sử dụng một tờ tài sản mà nói cho cả hai/GL và/LTCG. Dự án không sử dụng bất kỳ thư viện bên ngoài nào. Và tôi nhận được thông điệp này, điều này không có ý nghĩa gì cả. Nó biến mất, nếu tôi đi đến các thuộc tính của dự án và xác định "Sử dụng thế hệ mã thời gian liên kết" một lần nữa từ đó. Nó không thay đổi dòng lệnh hay bất cứ điều gì, nhưng chỉ làm cho VC hạnh phúc ...

21

Tôi đã có cùng một vấn đề, vì vậy tôi đã làm một số nghiên cứu.

Theo https://msdn.microsoft.com/en-us/library/0zza0de8.aspx:

Nếu bạn biên dịch chương trình của bạn với/GL và/c, bạn nên sử dụng/LTCG tùy chọn mối liên kết để tạo ra các tập tin đầu ra.

Vì vậy, thông điệp có thể là một chút sai lầm - vấn đề không phải là MSIL .netmodule, nhưng module biên soạn với /GL

Khi sử dụng /GL, bạn nói với trình biên dịch để trì hoãn việc tạo ra một số mã cụ thể là xung quanh phần đất của chức năng , để tối ưu hóa chúng. LTCG hướng dẫn trình liên kết tạo (và tối ưu hóa) mã bị thiếu. Nếu không, chương trình sẽ không chạy như mong đợi.

Về cơ bản, hai công tắc nên được sử dụng cùng nhau (khi được sử dụng). Chúng áp dụng cho các phần khác nhau của bản dựng: một phần để biên dịch và một phần khác cho liên kết.

Đối với đầy đủ:

  • /GL được điều khiển từ Configuration Properties> C/C++> Tối ưu hóa> Tối ưu hóa Chương trình Tổng

  • /LTCG được điều khiển từ Configuration Properties> Linker> Tối ưu hóa> Tối ưu hóa toàn bộ chương trình

Trên các phiên bản mới hơn,

  • /LTCG được điều khiển từ Configuration Properties> Linker> Tối ưu hóa> Link Time Code Generation/Sử dụng liên kết Time Code Generation (/ LTCG)
Các vấn đề liên quan