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

PHPz
Lepaskan: 2023-08-26 23:01:52
asal
1388 orang telah melayarinya

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

Selesaikan ralat kompilasi C++: 'rujukan tidak ditentukan kepada 'ruang nama::fungsi'', bagaimana untuk menyelesaikannya?

Apabila menulis atur cara dalam C++, kita sering menghadapi beberapa ralat kompilasi. Salah satu ralat biasa ialah 'rujukan tidak ditentukan kepada 'ruang nama::fungsi', yang bermaksud bahawa takrifan fungsi tidak boleh ditemui semasa fasa pemautan. Ralat ini biasanya berlaku apabila kami memanggil fungsi yang ditakrifkan dalam fail sumber atau perpustakaan lain. Artikel ini akan menumpukan pada ralat ini dan memperkenalkan beberapa penyelesaian yang mungkin.

Sebelum kita mula menyelesaikan ralat ini, mari kita lihat contoh kod mudah:

// file1.cpp

#include <iostream>

void foo();

int main() {
  foo();
  return 0;
}
Salin selepas log masuk
// file2.cpp

#include <iostream>

void foo() {
  std::cout << "Hello, world!" << std::endl;
}
Salin selepas log masuk

Dalam contoh di atas, kita mentakrifkan fungsi foo() dan menambahnya dalam main () Ia dipanggil dalam fungsi. Kami boleh menyimpan kedua-dua fail kod ini sebagai file1.cpp dan file2.cpp masing-masing. foo(),并在main()函数中调用了它。我们可以将这两个代码文件分别保存为file1.cppfile2.cpp

当我们尝试将这两个文件编译并链接在一起时,很可能会遇到以下错误:

undefined reference to `foo()'
Salin selepas log masuk

那么,如何解决这个错误呢?下面是几种可能的解决方法:

  1. 将所有源文件一起编译和链接:
    这是最简单的解决方法,只需要将两个源文件一起编译和链接即可。以GNU编译器为例,我们可以使用以下命令将两个文件一起编译:

    g++ file1.cpp file2.cpp -o program
    Salin selepas log masuk

    然后使用./program运行生成的可执行文件。

  2. 使用函数的声明:
    如果我们将foo()函数的声明放在file1.cpp文件的开头,就可以解决编译错误。修改file1.cpp如下:

    // file1.cpp
    
    #include <iostream>
    
    void foo(); // 在这里添加函数声明
    
    int main() {
      foo();
      return 0;
    }
    Salin selepas log masuk

    然后将两个文件一起编译和链接,就能成功执行程序了。

  3. 使用头文件:
    我们可以将foo()函数的声明放在一个单独的头文件中,然后在file1.cppfile2.cpp中分别包含这个头文件。修改代码如下:

    // file1.cpp
    
    #include <iostream>
    #include "functions.h" // 包含头文件
    
    int main() {
      foo();
      return 0;
    }
    Salin selepas log masuk
    // file2.cpp
    
    #include <iostream>
    #include "functions.h" // 包含头文件
    
    void foo() {
      std::cout << "Hello, world!" << std::endl;
    }
    Salin selepas log masuk

    functions.h

    Apabila kami cuba menyusun dan memautkan kedua-dua fail ini bersama-sama, kami berkemungkinan menghadapi ralat berikut:

    // functions.h
    
    void foo(); // 函数声明
    Salin selepas log masuk
    Jadi, bagaimana untuk menyelesaikan ralat ini? Berikut ialah beberapa penyelesaian yang mungkin:
    Kompilasi dan pautkan semua fail sumber bersama-sama:

    Ini ialah penyelesaian yang paling mudah, cuma susun dan pautkan dua fail sumber bersama-sama. Mengambil pengkompil GNU sebagai contoh, kita boleh menggunakan arahan berikut untuk menyusun kedua-dua fail bersama-sama:

    rrreee

    Kemudian gunakan ./program untuk menjalankan fail boleh laku yang dijana.

  4. 🎜Gunakan pengisytiharan fungsi: 🎜Jika kami meletakkan pengisytiharan fungsi foo() pada permulaan fail file1.cpp, kami boleh menyelesaikan ralat penyusunan. Ubah suai file1.cpp seperti berikut: 🎜rrreee🎜 Kemudian susun dan pautkan kedua-dua fail bersama, dan atur cara boleh dilaksanakan dengan jayanya. 🎜🎜
  5. 🎜Menggunakan fail pengepala: 🎜Kami boleh meletakkan pengisytiharan fungsi foo() dalam fail pengepala yang berasingan, dan kemudian menggunakan file1.cpp dan file2.cpp mengandungi fail pengepala ini masing-masing. Ubah suai kod seperti berikut: 🎜rrreeerrreee🎜functions.hKandungan fail pengepala adalah seperti berikut:🎜rrreee🎜Kemudian susun dan pautkan kedua-dua fail bersama, dan atur cara boleh dilaksanakan dengan jayanya. 🎜🎜🎜🎜Melalui tiga kaedah di atas, kami berjaya menyelesaikan ralat kompilasi 'rujukan tidak ditentukan kepada 'ruang nama::fungsi'. Sudah tentu, anda mungkin menghadapi situasi lain yang lebih kompleks dalam pengaturcaraan sebenar, tetapi idea untuk menyelesaikan masalah adalah serupa: pastikan definisi dan pengisytiharan fungsi dapat dilihat di mana ia perlu dipanggil. 🎜🎜Ringkasan: 🎜Apabila kita menemui ralat 'rujukan tidak ditentukan kepada 'ruang nama::fungsi' dalam pengaturcaraan C++, kita mesti terlebih dahulu memastikan ralat ini berlaku semasa fasa pemautan, menunjukkan bahawa takrifan fungsi tidak dapat ditemui. Kita boleh menyelesaikan ralat ini dengan menyusun dan memautkan semua fail sumber bersama-sama, menggunakan pengisytiharan fungsi, menggunakan fail pengepala, dsb. Ambil perhatian, semasa menyelesaikan masalah ralat, pastikan definisi dan pengisytiharan fungsi kelihatan di tempat ia dipanggil. 🎜
  6. Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan ralat kompilasi C++: 'rujukan tidak ditentukan kepada 'ruang nama::fungsi''?. 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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!