ข้อมูลการสนับสนุนภายในของ Microsoft
จุดบกพร่อง #: 101959 (Visual Studio)
สรุป
เมื่อคุณสร้าง DLL โดยใช้รุ่น 64 บิตของคอมไพเลอร์ Visual C++ ของ Microsoft และตัวเชื่อมโยงเขต คุณอาจได้รับตัวเชื่อมโยงเขตหมายเลขข้อผิดพลาด LNK4197 ถ้าฟังก์ชันที่ถูกประกาศสำหรับการส่งออกมากกว่าหนึ่งครั้ง
อาการ
ตัวเชื่อมโยงเขตผลลัพธ์อาจคล้ายกับข้อมูลต่อไปนี้:
C:\>link /NOLOGO /def:Sample.def /pdb:Sample.pdb /out:Sample.dll Sample.objSample.obj : warning LNK4197: export 'DllSample' specified multiple times; using first specification Creating library Sample.lib and object Sample.exp
สาเหตุ
มีสร้างตัวเชื่อมโยงเขตหมายเลขข้อผิดพลาด LNK4197 เมื่อฟังก์ชันถูกประกาศสำหรับการส่งออกมากกว่าหนึ่งครั้ง ฟังก์ชันถูกประกาศไว้สำหรับการส่งออกหนึ่งในวิธีการต่อไปนี้:
-
ฟังก์ชันถูกประกาศ โดยใช้คำสำคัญ__declspec(dllexport)ในแฟ้มต้นฉบับ C:
__declspec(dllexport) int DllSample() { return 42;}
-
ฟังก์ชันถูกประกาศไว้ โดยใช้คำนิยามโมดูล ( แฟ้ม DEF):
EXPORTS DllSample
ข้อผิดพลาดตัวเชื่อมโยงข้อมูลนี้อาจเกิดขึ้นบ่อยที่สุดเมื่อทั้งสองคำสำคัญ__declspec(dllexport)และยังได้ แฟ้ม DEF จะใช้เพื่อกำหนดชื่อฟังก์ชันเดียวกันในตัว DLL โครงการ
การแก้ไข
เมื่อต้องการแก้ไขลักษณะการทำงานนี้ กำหนดฟังก์ชันส่งออกเพียงครั้งเดียว โดยใช้คำสำคัญ__declspec(dllexport)หรือ โดยการใช้การ แฟ้ม DEF อย่าใช้ทั้งสองวิธีการเหล่านี้
สถานะ
พฤติกรรมเช่นนี้เกิดจากการออกแบบ
ข้อมูลเพิ่มเติม
ประกาศฟังก์ชันสำหรับการส่งออกมากกว่าหนึ่งครั้งอาจทำให้เกิดข้อผิดพลาดตัวเชื่อมโยงข้อมูลที่อธิบายไว้ในส่วน "อาการ" ของบทความนี้ในรุ่น 32 บิตของ Microsoft คอมไพเลอร์ c ++ของ Windows และตัวเชื่อมโยงข้อมูล อย่างไรก็ตาม Microsoft แนะนำให้ คุณกำหนดฟังก์ชันส่งออกเพียงครั้งเดียวในทั้งรุ่น 32 บิต และ 64 บิตรุ่น Windows c ++คอมไพเลอร์และตัวเชื่อมโยงข้อมูล