c++ - 使用 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.cpp
在lib/mandelbrot.dylib
无法访问src/mandelbrot.cpp
or的情况下绘制分形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> >)
我正在尝试更深入地挖掘并了解链接/编译过程。如何进行设置以演示我想要做什么?
解决方案
尝试将您的库命名为 libmandelbrot.dylib 以匹配 -lmandelbrot 标志
推荐阅读
- kubernetes - 如何在 Kubernetes 的 helm set switch 中添加空格
- python - 将 csv 文件读取到 Pandas 数据框 yfinance 中,并以代码作为文件名
- react-admin - React Admin 中的嵌套查询
- node.js - 如何为 NodeJs 区块链项目安装包
- sql - 在 sql server 中将 Varbinary 数据转换为 Nvarchar
- ios - 在 CoreData 记录中进行更改,SwiftUI
- android - 流响度归一化(ExoPlayer)
- git - 如何获取使用 Atlassian api 推送代码的用户
- video - FFmpeg:使用淡入/淡出效果向视频添加多个叠加层。命令有效,但图像(覆盖)未显示在视频中
- reactjs - React js - 尽管没有按下确定按钮,但 Ant Design 开关发生变化