2009-11-30 29 views
17

Tôi có tệp nguồn CPP sử dụng #if/#endif để biên dịch hoàn toàn trong các bản dựng nhất định. Tuy nhiên, điều này tạo ra cảnh báo sau.Cách tốt nhất để loại bỏ cảnh báo liên kết MS Visual C++ là gì: "cảnh báo LNK4221"?

warning LNK4221: no public symbols found; archive member will be inaccessible 

Tôi đã suy nghĩ về việc tạo một macro để tạo ra một biến giả hoặc chức năng đó sẽ không thực sự được sử dụng để lỗi này sẽ biến mất nhưng tôi muốn chắc chắn rằng nó không gây ra vấn đề như sử dụng macro trong nhiều tệp khiến trình liên kết bị đánh bom trên các biểu tượng được xác định nhân.

Cách tốt nhất để loại bỏ cảnh báo này (không chỉ đơn giản là loại bỏ cảnh báo trên dòng lệnh trình liên kết)?

FWIW, tôi muốn biết cách thực hiện bằng cách giảm cảnh báo trên dòng lệnh liên kết nhưng tất cả nỗ lực của tôi dường như bị bỏ qua bởi trình liên kết và vẫn tạo lỗi.

Một yêu cầu khác: Bản sửa lỗi phải có khả năng đứng lên bản dựng tệp hoặc xây dựng hợp nhất riêng lẻ (kết hợp xây dựng tệp CPP) vì một trong các cấu hình xây dựng của chúng tôi là một bản dựng hàng loạt. so với một tệp thống nhất tổng thể duy nhất).

+0

Cú pháp nào để gọi trình liên kết bạn đã thử (và nó không hiệu quả với bạn)? –

+0

Tôi đã thử "/ ignore: 4221" đối với liên kết và "#pragma warning (disable: 4221)" đối với tệp cpp. Không làm việc. – Adisak

+0

Là một sang một bên - mục đích của 'xây dựng sự thống nhất' là gì? –

Trả lời

12

OK, bản sửa lỗi tôi sẽ sử dụng là đề xuất của Pavel với một tinh chỉnh nhỏ. Lý do tôi đang sử dụng sửa chữa này là nó là một vĩ mô dễ dàng để thả vào và nó sẽ làm việc với số lượng lớn-xây dựng/đoàn kết-xây dựng cũng như bình thường xây dựng:

Shared Tiêu đề:

// The following macro "NoEmptyFile()" can be put into a file 
// in order suppress the MS Visual C++ Linker warning 4221 
// 
// warning LNK4221: no public symbols found; archive member will be inaccessible 
// 
// This warning occurs on PC and XBOX when a file compiles out completely 
// has no externally visible symbols which may be dependant on configuration 
// #defines and options. 

#define NoEmptyFile() namespace { char NoEmptyFileDummy##__LINE__; } 

File có thể biên dịch ra hoàn toàn:

NoEmptyFile() 
#if DEBUG_OPTION 
     // code 
#endif // DEBUG_OPTION 
20

Sử dụng một không gian tên vô danh:

namespace { char dummy; }; 

biểu tượng trong không gian tên như vậy có mối liên hệ bên ngoài, vì vậy sẽ có một cái gì đó trong bảng xuất khẩu. Mặt khác, tên không gian tên chính nó sẽ khác biệt (bạn có thể nghĩ nó là "được tạo ngẫu nhiên") cho mọi đơn vị dịch, do đó không có xung đột.

+1

Tôi sẽ thử nghiệm điều đó. Tôi cần nó để làm việc với xây dựng sự thống nhất vì vậy tôi có thể phải làm cho nó một vĩ mô với "char dummy ## __ LINE__;" hoặc một cái gì đó như thế vì vậy tôi không có các biểu tượng được sao chép trong một đơn vị dịch thuật đơn lẻ. – Adisak

+0

Tôi không nghĩ bạn cần nhiều hơn một đơn vị. – GManNickG

+0

Việc sửa chữa bom ở đây trên sự thống nhất của chúng tôi xây dựng như mong đợi, nhưng nó sẽ làm việc với mod nhỏ tôi mô tả. – Adisak

1

(Mặc dù các cuộc thảo luận là đã cũ và tôi không thể bình luận trực tiếp @ câu trả lời Adisak), tôi đoán thêm một số ma thuật mở rộng vĩ mô là cần thiết để làm việc này:

#define TOKENPASTE(x, y) x ## y 
#define TOKENPASTE2(x, y) TOKENPASTE(x, y) 
#define NONEMPTY_TRANSLATION_UNIT char TOKENPASTE2(NoEmptyFileDummy, __LINE__); 
Các vấn đề liên quan