Я хотел узнать, как создать общую библиотеку на C ++. Поэтому я нашел несколько логик c для генерации изображений Mandelbrot PPM и инкапсулировал их в src/mandelbrot.cpp
(с сопровождающим заголовочным файлом include/mandelbrot.cpp
). Дерево каталогов выглядит так:
$ tree
.
├── Makefile
├── include
│ └── mandelbrot.h
├── lib
│ └── mandelbrot.dylib
└── src
├── client.cpp
├── main
├── main.cpp
├── mandelbrot.cpp
└── mandelbrot.o
Цель состоит в том, чтобы src/client.cpp
использовал lib/mandelbrot.dylib
для рисования фрактала, не имея доступа к src/mandelbrot.cpp
или src/mandelbrot.o
.
Makefile:
.PHONY=clean
main: src/mandelbrot.o
clang++ src/main.cpp -o src/main src/mandelbrot.o -I ./include
src/mandelbrot.o:
clang++ -c src/mandelbrot.cpp -o src/mandelbrot.o -I ./include
clean:
rm src/*.o
rm lib/*.dylib
lib/mandelbrot.dylib:
clang++ -dynamiclib -o lib/mandelbrot.dylib src/mandelbrot.cpp -I ./include
src/client: lib/mandelbrot.dylib
clang++ src/client.cpp -o src/client -L ./lib -I ./include
Запуск исполняемого файла без dylib работает:
$ make main
clang++ src/main.cpp -o src/main src/mandelbrot.o -I ./include
$ ./src/main # runs fine!
Но я не могу получить ссылку на мою общую библиотеку при компиляции src/client.cpp
:
$ make src/client
clang++ src/client.cpp -o src/client -L ./lib -I ./include
Undefined symbols for architecture x86_64:
"fractal::Mandelbrot::writeToFile(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)", referenced from:
_main in client-e344c7.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [src/client] Error 1
Несмотря на то, что символ, кажется, находится в dylib:
$ file lib/mandelbrot.dylib
lib/mandelbrot.dylib: Mach-O 64-bit dynamically linked shared library x86_64
$ nm -C lib/mandelbrot.dylib | grep writeToFile
0000000000001460 T fractal::Mandelbrot::writeToFile(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)
Я пытаюсь углубиться и понять процесс компоновки / компиляции. Как мне выполнить настройку, которая у меня есть, чтобы продемонстрировать, что я хочу сделать?