Получение `(.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
приводит к успешной компиляции.
Это может быть очевидно для опытных программистов на С++, но я не понимаю, что происходит на самом деле. Я хочу понять, почему и почему нет, он сделал то, что сделал. Хотя я едва могу интуитивно понять, что происходит, немного больше информации об этом было бы здорово :)