Bagikan melalui


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).