Получение `(.text+0x288): неопределенная ссылка` практически на любой внешний объект (из файлов заголовков), если только набор файлов `cpp` не скомпилирован вместе

Я пытаюсь обернуть элементы этого репозитория ascii-art . я использую g++ 9.3.0 cpp-17на убунту 20.04. Вот обзор дерева каталогов -

      ├── build
├── in
│   ├── js.bmp
│   ├── socrates.bmp
│   └── woman.bmp
├── LICENSE
├── makefile
├── out
│   ├── js.txt
│   ├── socrates.txt
│   └── woman.txt
├── README.md
├── results
│   ├── js.png
│   ├── socrates.png
│   └── woman.png
└── src
    ├── headers
    │   ├── bmp_body.h
    │   ├── bmp_header.h
    │   ├── bmp_image.h
    │   ├── bmp_process.h
    │   └── bmp_reader.h
    ├── lib
    │   ├── bmp_body.cpp
    │   ├── bmp_header.cpp
    │   ├── bmp_image.cpp
    │   ├── bmp_process.cpp
    │   └── bmp_reader.cpp
    └── main.cpp

Следуя своей интуиции, компиляция исключительно src/main.cpp, а именно g++ -Wall src/main.cppприводит к ошибкам неопределенных ссылок.

      /usr/bin/ld: /tmp/ccTouLyj.o: in function `main':
main.cpp:(.text+0x12f): undefined reference to `new_bmp_image()'
/usr/bin/ld: main.cpp:(.text+0x162): undefined reference to `bmp_read_header(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned char*)'
/usr/bin/ld: main.cpp:(.text+0x1aa): undefined reference to `delete_bmp_image(bmp_image*)'
/usr/bin/ld: main.cpp:(.text+0x262): undefined reference to `bmp_read_body(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, int, int, int, int, int)'
/usr/bin/ld: main.cpp:(.text+0x288): undefined reference to `bmp_to_ascii(bmp_image*)'
/usr/bin/ld: main.cpp:(.text+0x297): undefined reference to `delete_bmp_image(bmp_image*)'
collect2: error: ld returned 1 exit status

компиляция каждого файла под src, а именно main.cppа также lib/*.cpp, приводит к успеху.

А именно команду, g++ -Wall src/main.cpp src/lib/*.cppприводит к успешной компиляции.

Это может быть очевидно для опытных программистов на С++, но я не понимаю, что происходит на самом деле. Я хочу понять, почему и почему нет, он сделал то, что сделал. Хотя я едва могу интуитивно понять, что происходит, немного больше информации об этом было бы здорово :)

0 ответов

Другие вопросы по тегам