首页 > 解决方案 > 使用 clang++ 在 Mac OSX 上创建动态库

问题描述

我想学习如何用 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.cpplib/mandelbrot.dylib无法访问src/mandelbrot.cppor的情况下绘制分形src/mandelbrot.o

生成文件:

.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> >)

我正在尝试更深入地挖掘并了解链接/编译过程。如何进行设置以演示我想要做什么?

标签: c++makefileclang++dylib

解决方案


尝试将您的库命名为 libmandelbrot.dylib 以匹配 -lmandelbrot 标志


推荐阅读