Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk menyelesaikan ralat kompilasi C++: 'rujukan tidak ditentukan'?

Bagaimana untuk menyelesaikan ralat kompilasi C++: 'rujukan tidak ditentukan'?

WBOY
Lepaskan: 2023-08-26 22:06:25
asal
3784 orang telah melayarinya

如何解决C++编译错误:'undefined reference to'?

Bagaimana untuk menyelesaikan ralat kompilasi C++: 'rujukan tidak ditentukan kepada'?

Pengenalan:
Apabila pengaturcaraan dalam C++, kadangkala anda akan menemui mesej ralat kompilasi yang serupa dengan "rujukan tidak ditentukan kepada". Ralat jenis ini biasanya disebabkan oleh ralat pautan, yang disebabkan oleh ketidakupayaan pengkompil untuk mencari definisi fungsi atau pembolehubah yang berkaitan semasa proses pautan. Artikel ini akan memperkenalkan beberapa punca dan penyelesaian biasa serta menggunakan contoh kod untuk membantu pembaca memahami dan menyelesaikan masalah sedemikian dengan lebih baik.

1. Analisis sebab:

  1. Fungsi/pembolehubah tidak ditentukan: Apabila menggunakan fungsi atau pembolehubah, jika takrifan yang sepadan tidak ditemui dalam kod, ralat "rujukan tidak ditentukan" akan berlaku. Ini mungkin disebabkan oleh salah ejaan fungsi/nama pembolehubah, fungsi yang tidak konsisten/pengisytiharan atau definisi pembolehubah, fungsi/pembolehubah tidak disertakan dengan betul, dsb.
  2. Tertib pemautan yang salah: Jika terdapat berbilang fail sumber dalam kod dan terdapat saling bergantung antara mereka, pengkompil perlu memaut dalam susunan yang betul semasa memaut. Jika susunan pemautan salah, ralat "rujukan tidak ditentukan" akan terhasil.

2. Penyelesaian:
1. Semak definisi dan pengisytiharan fungsi/pembolehubah: Pertama, pastikan nama fungsi/pembolehubah dieja dengan betul, memberi perhatian khusus kepada huruf besar. Kedua, semak sama ada pengisytiharan dan takrifan fungsi/pembolehubah adalah konsisten, termasuk jenis parameter, jenis nilai pulangan, dsb. Jika fungsi/pembolehubah ditakrifkan dalam fail sumber lain, pastikan anda merujuk fail pengepala yang betul dan menyusun serta memautkan fail sumber bersama-sama.

Kod sampel 1:

// File1.cpp
#include "MyClass.h"
void foo();

int main() {
    foo();
    return 0;
}

// File2.cpp
#include <iostream>
#include "MyClass.h"
void foo() {
    MyClass obj;
    obj.bar();
}

// MyClass.h
class MyClass {
public:
    void bar();
};
Salin selepas log masuk

Dalam kod sampel di atas, kami mentakrifkan kelas bernama MyClass dan memanggil kelas bernama File1.cpp The code>foo() Fungsi melaksanakan takrifan fungsi foo() dalam File2.cpp. Ambil perhatian bahawa kelas MyClass diisytiharkan dalam fail pengepala MyClass.h. Jika ralat "rujukan tidak ditentukan kepada 'foo()'" berlaku semasa menyusun File1.cpp dan File2.cpp, anda harus menyemak foo()</code >Sama ada pengisytiharan dan takrifan fungsi adalah konsisten dan pastikan fail pengepala <code>MyClass.h dirujuk dengan betul. MyClass的类,在File1.cpp中调用了一个名为foo()的函数,在File2.cpp中实现了foo()函数的定义。注意,在MyClass.h头文件中声明了MyClass类。如果在编译File1.cppFile2.cpp时出现"undefined reference to 'foo()'"的错误,应该检查foo()函数的声明和定义是否一致,并确保正确引用了MyClass.h头文件。

2.检查链接顺序:如果代码中存在多个源文件,并且它们之间有相互依赖的关系,编译器在链接时需要按照正确的顺序进行链接。我们可以通过将源文件按正确的顺序传递给编译器来解决此问题,或者使用链接器提供的命令行选项指定链接顺序。

示例代码2:

// File1.cpp
#include "File2.h"
void foo();

int main() {
    foo();
    return 0;
}

// File2.h
void foo();

// File2.cpp
#include "File2.h"
void foo() {
    // do something
}
Salin selepas log masuk

在上述示例代码中,File1.cpp依赖于File2.cpp中定义的foo()函数。如果在编译时出现"undefined reference to 'foo()'"的错误,应该检查File2.cpp

2 Semak susunan pemautan: Jika terdapat berbilang fail sumber dalam kod dan terdapat saling bergantung antara mereka, pengkompil perlu memaut dalam susunan yang betul semasa memaut. Kita boleh menyelesaikan masalah ini dengan menghantar fail sumber kepada pengkompil dalam susunan yang betul, atau menentukan susunan pemautan menggunakan pilihan baris arahan yang disediakan oleh pemaut.

Contoh kod 2:

g++ -o main File2.cpp File1.cpp
Salin selepas log masuk

Dalam kod contoh di atas, File1.cpp bergantung pada foo() yang ditakrifkan dalam fungsi File2.cpp . Jika ralat "rujukan tidak ditentukan kepada 'foo()'" berlaku semasa penyusunan, anda harus menyemak sama ada susunan kompilasi File2.cpp adalah betul. Kami boleh menyusun kedua-dua fail ini dalam susunan yang betul, contohnya:

g++ -o main File1.cpp File2.cpp
Salin selepas log masuk

atau nyatakan susunan pautan pada masa penyusunan: rrreee🎜 Sila ambil perhatian bahawa mungkin terdapat kes yang lebih kompleks yang perlu diselaraskan pada kes demi kes asas. 🎜🎜Kesimpulan: 🎜Dalam pengaturcaraan C++, ralat "rujukan tidak ditentukan" ialah ralat pemautan yang biasa. Apabila menyelesaikan ralat ini, kita harus menyemak semula definisi dan pengisytiharan fungsi/pembolehubah untuk memastikan nama mereka dieja dengan betul dan skopnya adalah betul. Dalam kes berbilang fail sumber, anda juga perlu menyemak secara khusus sama ada susunan pautan adalah betul. Melalui penyelesaian dan kod sampel di atas, saya percaya pembaca boleh lebih memahami dan menyelesaikan ralat tersebut serta meningkatkan kecekapan pengaturcaraan mereka. 🎜

Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan ralat kompilasi C++: 'rujukan tidak ditentukan'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan