LNK4221 Peringatan Alat Linker
File objek ini tidak menentukan simbol publik yang sebelumnya tidak terdefinisi, sehingga tidak akan digunakan oleh operasi tautan apa pun yang menggunakan pustaka ini
Pertimbangkan dua cuplikan kode berikut, a.cpp
:
// a.cpp
#include <atlbase.h>
Dan b.cpp
:
// b.cpp
#include <atlbase.h>
int function()
{
return 0;
}
Untuk mengkompilasi file dan membuat dua file objek, jalankan cl /c a.cpp b.cpp
pada prompt perintah. Jika Anda menautkan file objek dengan menjalankan link /lib /out:test.lib a.obj b.obj
, Anda akan menerima peringatan LNK4221. Jika Anda menautkan objek dengan menjalankan link /lib /out:test.lib b.obj a.obj
, Anda tidak akan menerima peringatan.
Tidak ada peringatan yang dikeluarkan dalam skenario kedua karena linker beroperasi dengan cara last-in first-out (LIFO). Dalam skenario pertama, b.obj
diproses sebelum a.obj
, dan a.obj
tidak memiliki simbol baru untuk ditambahkan. Dengan menginstruksikan linker untuk memproses terlebih a.obj
dahulu, Anda dapat menghindari peringatan.
Penyebab umum kesalahan ini adalah ketika dua file sumber menentukan opsi /Yc
(Buat File Header yang Telah Dikompresi) dengan nama file header yang sama yang ditentukan di bidang Header yang Telah Dikompresi. Penyebab umum masalah ini berurusan dengan pch.h
karena, secara default, pch.cpp
menyertakan pch.h
dan tidak menambahkan simbol baru. Jika file sumber lain disertakan pch.h
dengan /Yc
dan file terkait diproses .obj
sebelum pch.obj
, linker akan melemparkan LNK4221.
Penyebab umum kesalahan ini adalah ketika dua file sumber menentukan opsi /Yc
(Buat File Header yang Telah Dikompresi) dengan nama file header yang sama yang ditentukan di bidang Header yang Telah Dikompresi. Penyebab umum masalah ini berurusan dengan stdafx.h
karena, secara default, stdafx.cpp
menyertakan stdafx.h
dan tidak menambahkan simbol baru. Jika file sumber lain disertakan stdafx.h
dengan /Yc
dan file terkait diproses .obj
sebelum stdafx.obj
, linker akan melemparkan LNK4221.
Salah satu cara untuk mengatasi masalah ini adalah dengan memastikan bahwa untuk setiap header yang telah dikommpilasikan sebelumnya, hanya ada satu file sumber yang menyertakannya dengan /Yc
. Semua file sumber lainnya harus menggunakan header yang telah dikommpilasikan sebelumnya. Untuk informasi selengkapnya tentang cara mengubah pengaturan ini, lihat /Yu
(Gunakan File Header Yang Telah Dikompresi).
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk