Visual C ++: Làm cách nào để tắt cảnh báo trình liên kết cụ thể?


118

Tôi đang sử dụng một thư viện từ CGAL mà trong giai đoạn liên kết của quá trình biên dịch mã của tôi tạo ra rất nhiều cảnh báo liên kết dạng này:

warning LNK4099: PDB 'vc80.pdb' was not found with 'gmp-vc80-mt-sgd.lib' or at 'vc80.pdb'; linking object as if no debug info

Làm cách nào để tắt cảnh báo trình liên kết cụ thể này trong Visual C ++ / Studio 2008?

Lưu ý rằng tôi không có bất kỳ quyền kiểm soát nào đối với thư viện bên ngoài (CGAL) mà tôi đang sử dụng. Tôi không thể / donot muốn biên dịch lại thư viện bên ngoài. Do đó, tôi cần phải sửa các tin nhắn.


1
Đối với VS2005 / ignore: 4099 hoạt động tốt.

/ ignore: 4099 hoạt động tốt ở đây với VS2008.
Tom

/ignore:4099hoạt động tốt trong Visual Studio 10 với C ++. Tôi đã nhận được cảnh báo LNK4099: PDB 'vc100.pdb' was not found with 'gtest_main-mdd.lib(gtest_main.obj)và đã tìm cách gỡ bỏ nó theo cách này.
Manolete


3
VS2013 chấp nhận / bỏ qua: 4099 chỉ tốt :)
mlvljr

Câu trả lời:


101

Thêm phần sau làm tùy chọn trình liên kết bổ sung:

 /ignore:4099

Đây là trong Thuộc tính-> Trình liên kết-> Dòng lệnh


5
Tôi không nghĩ / bỏ qua tồn tại. Các lỗi vẫn được liệt kê và / bỏ qua không được ghi lại trong MSDN. Tôi đang cố tắt 4075 cho "cảnh báo LNK4075: bỏ qua '/ EDITANDCONTINUE' do đặc điểm kỹ thuật '/ INCREMENTAL: NO'."
Nick Desjardins

1
/ IGNORE không được ghi lại nhưng có sẵn. Xem connect.microsoft.com/VisualStudio/feedback/details/176188/…
Aaron Saarela

5
Không hoạt động đối với cảnh báo 4099 connect.microsoft.com/VisualStudio/feedback/details/176188/…
KindDragon

7
Bạn có thể sử dụng / bỏ qua: 4099 làm cờ liên kết, nhưng có một điểm khó khăn. Thật không may, Microsoft đã quyết định đặt 4099 là một cảnh báo không thể bỏ qua, vì vậy bạn phải vá link.exe. Nghe có vẻ hơi điên rồ, nhưng đơn giản là không còn cách nào khác. Thông tin chi tiết tại đây: Bottlelight.com/docs/lnk4099.html Tôi đã sử dụng HxD làm trình chỉnh sửa hex và việc làm theo mô tả trên trang đó hoạt động tốt với VS10. Thứ tự vẫn là 4088, 4099, 4105.
Andreas Haferburg

2
Hoạt động trên VS 2015 (dự án đang sử dụng bộ công cụ VS2013, không chắc liệu điều đó có tạo nên sự khác biệt hay không)
Assimilater

50

Cập nhật 2018-10-16

Được biết, kể từ VS 2013, cảnh báo này có thể bị vô hiệu hóa. Xem bình luận của @Mark Ransom.

Câu trả lời gốc

Bạn không thể tắt cảnh báo cụ thể đó.

Theo Geoff Chappell , cảnh báo 4099 được coi là quá quan trọng để bỏ qua, ngay cả khi sử dụng kết hợp với / wx (sẽ coi cảnh báo là lỗi và bỏ qua cảnh báo được chỉ định trong các tình huống khác)

Đây là văn bản có liên quan từ liên kết:

Cảnh báo Không Khá Không thể Bỏ qua

Đối với một số số cảnh báo, thông số kỹ thuật trong tùy chọn a / ignore được chấp nhận nhưng không nhất thiết phải thực hiện. Nếu cảnh báo xảy ra trong khi tùy chọn / wx không hoạt động, thì thông báo cảnh báo vẫn được hiển thị, nhưng nếu tùy chọn / wx đang hoạt động, thì cảnh báo sẽ bị bỏ qua. Nó giống như thể cảnh báo được cho là đủ quan trọng để ghi đè nỗ lực bỏ qua nó, nhưng không phải nếu người dùng đặt giá quá cao cho những cảnh báo không được đề xuất.

Các số cảnh báo sau bị ảnh hưởng:

4200, 4203, 4204, 4205, 4206, 4207, 4208, 4209, 4219, 4231 and 4237

Anh ta không nói "cảnh báo 4099 là quá quan trọng để bỏ qua"; anh ta suy luận điều này từ thực tế rằng nó không thể tắt được. (Được chú ý ở đây vì không có thêm thông tin nào tại liên kết đó.)
Ben M

Cập nhật để giải quyết mối quan tâm của bạn @BenM
John Weldon

1
Câu trả lời này , vô hiệu hóa cảnh báo 4099 hoạt động tốt đối với tôi trên VS2017. Có vẻ như từ các bình luận ở đây rằng nó có thể bị vô hiệu hóa có thể bắt đầu từ VS2013.
Mark Ransom

10

(Đối với bản ghi và trước khi chuỗi biến mất trên diễn đàn msdn) Bạn không thể tắt cảnh báo (ít nhất là trong VS2010) vì nó nằm trong danh sách các cảnh báo không thể tắt (vì vậy / wd4099 sẽ không hoạt động) , nhưng những gì bạn có thể làm là vá link.exe (thường là C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ bin \ link.exe) để loại bỏ nó khỏi danh sách. Nghe giống như một cái búa khoan, tôi biết. Nó hoạt động mặc dù.

Ví dụ: nếu bạn muốn xóa cảnh báo cho 4099, hãy mở link.exe bằng trình chỉnh sửa hex, đi tới dòng 15A0 có nội dung 03 10 (endian nhỏ cho 4099) và thay thế nó bằng FF 00 (không tồn tại).


5
Bạn nên tìm dãy số F8 0F 00 00 - 03 10 00 00 - 09 10 00 00 (4088, 4099, 4105 là các từ kép 32 bit trong phần cuối nhỏ). Nó cũng giống như vậy trong amd64 / link.exe.
Andreas Haferburg

8

Vì lợi ích của người khác, tôi mặc dù tôi muốn bao gồm những gì tôi đã làm.

Vì bạn không thể khiến Visual Studio (trong trường hợp của tôi là 2010) bỏ qua các cảnh báo LNK4204, cách tiếp cận của tôi là cung cấp cho nó những gì nó muốn: các tệp pdb. Vì tôi đang sử dụng thư viện mã nguồn mở trong trường hợp của mình, tôi đã có mã xây dựng tệp pdb.

NHƯNG, mặc định là đặt tên tất cả các tệp PDF giống nhau: vc100.pdb trong trường hợp của tôi. Vì bạn cần .pdb cho mỗi và mọi .lib, điều này tạo ra một vấn đề, đặc biệt nếu bạn đang sử dụng thứ gì đó như ImageMagik, tạo ra khoảng 20 tệp .lib tĩnh. Bạn không thể có 20 tệp lib trong một thư mục (mà trình liên kết của ứng dụng của bạn tham chiếu đến liên kết trong các thư viện từ đó) và có tất cả 20 tệp .pdb được gọi giống nhau.

Giải pháp của tôi là xây dựng lại các tệp thư viện tĩnh của mình và định cấu hình VS2010 để đặt tên tệp .pdb liên quan đến DỰ ÁN. Bằng cách này, mỗi .lib nhận được một .pdb có tên tương tự và bạn có thể đặt tất cả LIB và PDB vào một thư mục để dự án của bạn sử dụng.

Vì vậy, đối với cấu hình "Gỡ lỗi", tôi đã chỉnh sửa:

Thuộc tính-> Thuộc tính cấu hình -> C / C ++ -> Tệp đầu ra -> Tên tệp cơ sở dữ liệu chương trình từ

$ (IntDir) vc $ (PlatformToolsetVersion) .pdb

là giá trị sau:

$ (OutDir) vc $ (PlatformToolsetVersion) D $ (ProjectName) .pdb

Bây giờ thay vì ở đâu đó trong thư mục trung gian, các tệp .pdb được ghi vào thư mục đầu ra, nơi các tệp .lib cũng đang được viết, VÀ quan trọng nhất, chúng được đặt tên với hậu tố là D + tên dự án . Điều này có nghĩa là mỗi dự án thư viện tạo ra một dự án .lib và một dự án cụ thể .pdb.

Giờ đây, tôi có thể sao chép tất cả các tệp .lib phát hành của mình, tệp .lib gỡ lỗi của tôi và tệp .pdb gỡ lỗi vào một nơi trên hệ thống phát triển của tôi và dự án sử dụng thư viện bên thứ 3 đó ở chế độ gỡ lỗi, có pdb tệp nó cần trong chế độ gỡ lỗi.


2
Tôi muốn nói đây là những câu trả lời cho câu hỏi này. Gợi ý PATCHING THE LINKER mà nhiều câu trả lời chứa là asinine. Ngay cả khi Microsoft "sai" khi đưa ra cảnh báo này là không thể bỏ qua.
Tamás Szelei

3
Đây là câu trả lời thích hợp NẾU bạn đang biên dịch thư viện từ nguồn. Nhưng một số chương trình có sự phụ thuộc vào các thư viện thương mại không bao gồm tệp .pdb, vì vậy việc tạo tệp .pdb cho chúng không phải là một tùy chọn.
Bryce Wagner

3

Tôi nghi ngờ / bỏ qua là một tùy chọn VC6 link.exe. đối với VS2005 và trình liên kết của VS2008, không có tùy chọn được lập tài liệu / bỏ qua, nhưng trình liên kết có vẻ chỉ bỏ qua tùy chọn "/ ignore: XXX", không có lỗi và không ảnh hưởng.


2
Trên thực tế, nó được đảm bảo không bỏ qua các cảnh báo của trình liên kết, vì vậy cờ bỏ qua đã bị vô hiệu hóa sau VC6: bytes.com/topic/net/answers/…
Gyuri,

/ ignore có thể được sử dụng lại trong VS2013.
Fernando Gonzalez Sanchez

1

Tệp PDB thường được sử dụng để lưu trữ thông tin gỡ lỗi. Cảnh báo này được gây ra có thể là do tệp vc80.pdbkhông được tìm thấy khi liên kết tệp đối tượng đích. Đọc mục MSDN trên LNK4099 tại đây .

Ngoài ra, bạn có thể tắt tạo thông tin gỡ lỗi từ trường Thuộc tính dự án> Trình liên kết> Gỡ lỗi> Tạo thông tin gỡ lỗi.


3
Tắt thông tin gỡ lỗi sẽ giải quyết các cảnh báo của trình liên kết, nhưng sau đó các điểm ngắt không hoạt động nếu không có thông tin gỡ lỗi. Điều đó không hữu ích cho tôi.
Ashwin Nanjappa

2
Tắt cảnh báo không bao giờ là điều đúng đắn phải làm. Sửa chúng. Bạn cần tìm pdb và xem nó có được sao chép vào vị trí thích hợp hay không.
dirkgently

Haizz, đó là sự thật! Đáng buồn là trong trường hợp này, tôi không thể tìm thấy pdb đó.
Ashwin Nanjappa

1
vc80.pdb chỉ là tên pdb mặc định cho vc8. Cảnh báo này chỉ có nghĩa là không có thông tin gỡ lỗi cho thư viện CGAL. Nó là an toàn để bỏ qua.
JoeG

1

CHỈNH SỬA: không sử dụng vc80 / Visual Studio 2005, mà sử dụng phiên bản Visual Studio 2008 / vc90 của thư viện CGAL (có thể từ đây ).

Cảnh báo Công cụ liên kết LNK4099 :

Bạn cũng có thể biên dịch bằng / Z7, do đó, pdb không cần được sử dụng hoặc loại bỏ tùy chọn trình liên kết / DEBUG nếu bạn không có tệp .pdb cho các đối tượng bạn đang liên kết.


2
Cảm ơn. Biên dịch bằng / Z7 vẫn yêu cầu tệp .pdb của thư viện CGAL. / DEBUG giải quyết các cảnh báo của trình liên kết, nhưng sau đó các điểm ngắt không hoạt động nếu không có thông tin gỡ lỗi.
Ashwin Nanjappa

1

Bạn không thể tắt cảnh báo trình liên kết 4099, như @John Weldon đã nói.

Bạn nên xây dựng lại thư viện với một số thay đổi cấu hình dự án. Bạn có một số tùy chọn:

  • Lưu tệp PDB với thông tin gỡ lỗi là cùng thư mục nơi bạn lưu tệp .lib. Đặt giá trị "$ (OutDir) $ (TargetName) .pdb" thành Thuộc tính-> C / C ++ -> Tên tệp cơ sở dữ liệu chương trình đầu ra
  • Lưu thông tin gỡ lỗi trong tệp .lib. Đặt giá trị "C7 tương thích (/ Z7)" thành Thuộc tính-> C / C ++ -> Chung-> Định dạng thông tin gỡ lỗi
  • Tắt thông tin gỡ lỗi tạo cho thư viện này. Xóa giá trị khỏi Thuộc tính-> C / C ++ -> Chung-> Định dạng thông tin gỡ lỗi
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.