Glad: Masalah Menggunakan g ++ pada Max OS: Simbol tidak ditentukan untuk arsitektur x86_64

Dibuat pada 6 Nov 2018  ·  4Komentar  ·  Sumber: Dav1dde/glad

Info dasar:

  1. sistem: macOS High Sierra (10.13.6)
  2. editor: vs code (versi terbaru)
  3. Penyusun: g ++ (Xcode)
  4. Target : gunakan GLFW + GLAD

Deskripsi Pertanyaan:
Baru-baru ini, saya belajar melakukan beberapa pekerjaan yang berhubungan dengan Grafik Komputer. Semuanya berjalan lancar. Namun, ketika saya membuat jendela untuk menguji kesalahan env.Link terjadi:

Undefined symbols for architecture x86_64:
"_gladLoadGLLoader", referenced from:
  _main in main-5c211c.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
The terminal process terminated with exit code: 1

Sepertinya saya belum menautkan beberapa file pihak ketiga. sayatelah memperbaiki masalah yang persis sama dengan menambahkan "-lglfw" args ke g ++ saat menggunakan fungsi di glfw3.h.
Tetapi ketika bertemu dengan fungsi

Sesuatu yang telah saya lakukan:

  1. Dapat menemukan file head.

    #include glad/glad.h  
    #include GLFW/glfw3.h
    
  2. Telah meletakkan file "lega.c" di ruang kerja.

  3. Tambahkan "g ++ -L atau I / usr / lib atau / usr / local / lib atau / usr / local / include", Tetapi tidak berfungsi.

Terima kasih sebelumnya!

C glad1 question

Komentar yang paling membantu

Anda perlu mengkompilasi glad.c dengan file Anda. Misalnya Anda akan mengkompilasi contoh menggunakan perintah berikut:

g++ example/c++/hellowindow2.cpp -Ibuild/include build/src/glad.c -lglfw -ldl

Dapatkah Anda menunjukkan kepada saya penyiapan build Anda atau memverifikasi bahwa glad.c diteruskan ke compiler (dan secara opsional glad.o ke linker)?

Semua 4 komentar

Anda perlu mengkompilasi glad.c dengan file Anda. Misalnya Anda akan mengkompilasi contoh menggunakan perintah berikut:

g++ example/c++/hellowindow2.cpp -Ibuild/include build/src/glad.c -lglfw -ldl

Dapatkah Anda menunjukkan kepada saya penyiapan build Anda atau memverifikasi bahwa glad.c diteruskan ke compiler (dan secara opsional glad.o ke linker)?

Ya kamu benar! Saya tidak memberi tahu g ++ untuk mengkompilasi glad.c secara eksplisit, saya pikir file tersebut akan dipenuhi secara default. Ini adalah pengaturan build saya:

{
"version": "2.0.0",
"tasks": [
    {
        "label": "testwindow",
        "type": "shell",
        "command": "g++",
        "args": [
            "glad.c",
            "-lglfw",
            "${file}",
            "-o",
            "${fileDirname}/${fileBasenameNoExtension}.out",
            "-g",
        ],
             "group": {
                  "kind": "build",
                  "isDefault": true
            }
        }
    ]
}

Saya masih memiliki kekhawatiran bahwa saya hanya memasukkan glad.c ke args tanpa operasi lain.
Apakah urutan args ke g ++ penting atau akankah itu menyebabkan beberapa masalah mendasar?
Itu mengganggu saya cukup lama. Terima kasih!

(PS: Jujur saja, saya pemula di C / Cpp. Ini pertama kalinya saya menggunakan lib dan compiler pihak ketiga tanpa IDE seperti VS, Apakah Anda tahu beberapa sumber online (kuliah buku / video) tentang mempelajari cara menggunakan compiler seperti g ++ , gcc, dll?)

Memiliki glad.c termasuk seperti itu tidak masalah.

Anda ingin memindahkan -lglfw ke akhir daftar argumen Anda (pada dasarnya itu adalah kasus untuk semua perintah penaut).

Alasannya adalah, pembuatan biner dibagi menjadi dua fase 1) kompilasi dan 2) penautan, biasanya Anda memerlukan kompiler untuk mengkompilasi file (biasanya dilakukan dengan -c flag dan mengeluarkan .o file) dan linker untuk menautkan file .o bersama-sama dan membuat file eksekusi akhir. GCC / G ++ cukup berbaik hati memanggil linker (biasanya ld ) untuk Anda. Jadi, jika Anda hanya meneruskan sekumpulan file C / C ++ yang dikompilasi dan menautkannya ke file yang dapat dieksekusi. Linker itu sendiri mencoba untuk memasukkan sesedikit mungkin ke dalam executable, jadi jika Anda meneruskannya ke sebuah perpustakaan misalnya -lglfw di awal (argumen pertama), ia melihat bahwa perpustakaan tersebut memiliki sekumpulan simbol yang diekspor ( misalnya glfwGetProcAddress ) tetapi tidak ada file yang mereferensikan simbol perpustakaan itu, jadi file tersebut dibuang begitu saja (yang tidak Anda inginkan karena file Anda mereferensikan simbol itu, tetapi diteruskan kemudian).

Secara pribadi saya akan mencari Makefile sangat sederhana dan dasar dan bekerja dengan itu.

Terima kasih atas saran dan penjelasan rinci Anda. Anda menyelesaikan masalah saya dengan sempurna!

Apakah halaman ini membantu?
0 / 5 - 0 peringkat