我尝试了不同的方法来从openvdb cookbook运行最新版本5.1.0的hello world示例。但是我的MacBook Pro(macOS High Sierra 10.13.4)上出现Undefined symbols for architecture x86_64
错误。
为了缩小问题范围,我将hello world示例简化为:
//test.cpp
#include <openvdb/openvdb.h>
#include <iostream>
int main()
{
openvdb::initialize();
}
为了编译代码,我使用homebrew brew install openvdb
安装了openvdb 5.1.0。我用来编译代码的命令行是(g ++ version = 5.4.0):
g++ -g -std=c++11 -I/usr/local/Cellar/openvdb/5.1.0_1/include \
-I /usr/local/Cellar/boost/1.67.0_1/include \
-I /usr/local/Cellar/tbb/2018_U4/include \
-L /usr/local/Cellar/openvdb/5.1.0_1/lib \
-L /usr/local/Cellar/boost/1.67.0_1/lib \
-L /usr/local/Cellar/tbb/2018_U4/lib \
test.cpp -lopenvdb -ltbb -lHalf -lpthread
我得到的是:
Undefined symbols for architecture x86_64:
"openvdb::v5_1::math::simplify(std::shared_ptr<openvdb::v5_1::math::AffineMap>)", referenced from:
openvdb::v5_1::math::AffineMap::preRotate(double, openvdb::v5_1::math::Axis) const in ccBVTtHl.o
openvdb::v5_1::math::AffineMap::preShear(double, openvdb::v5_1::math::Axis, openvdb::v5_1::math::Axis) const in ccBVTtHl.o
openvdb::v5_1::math::AffineMap::postRotate(double, openvdb::v5_1::math::Axis) const in ccBVTtHl.o
openvdb::v5_1::math::AffineMap::postShear(double, openvdb::v5_1::math::Axis, openvdb::v5_1::math::Axis) const in ccBVTtHl.o
openvdb::v5_1::math::ScaleMap::preRotate(double, openvdb::v5_1::math::Axis) const in ccBVTtHl.o
openvdb::v5_1::math::ScaleMap::preShear(double, openvdb::v5_1::math::Axis, openvdb::v5_1::math::Axis) const in ccBVTtHl.o
openvdb::v5_1::math::ScaleMap::postRotate(double, openvdb::v5_1::math::Axis) const in ccBVTtHl.o
...
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
似乎openvdb
lib没有包含函数实现。我错过了什么吗?
我也尝试从openvdb git v5.1.0编译。其他依赖包通过自制软件安装(只有blosc从c-blosc git中提取)。但是,错误是一样的。
在Mac上运行openvdb 5.1.0会遇到同样的问题吗?
更新:
我尝试使用nm
来确定test.o中的符号(使用相同的编译命令而不引用任何库)是否在openvdb.dylib
内。我的目标符号是simplify
。输出如下:
$ nm -A test.o | grep简化
test.o:你 __ZN7openvdb4v5_14math8simplify的 ESt10 shared_ptrINS1_9AffineMapEE
$ nm -A libopenvdb.dylib | grep简化
libopenvdb.dylib:0000000000027a2a T __ZN7openvdb4v5_14math8simplify ENSt3__110 shared_ptrINS1_9AffineMapEE E
$ nm -A git5.1.0 / libopenvdb.dylib | grep简化
libopenvdb.dylib:00000000000d56c0 T __ZN7openvdb8v5_ 1abi34 math8simplify EN5boost10 shared_ptrINS1_9AffineMapEE E
(我删除了路径以提高可读性)
就是这样!我突出了三个不同之处。我不知道突出显示部分的确切含义。我的猜测是三个文件中的shared_ptr来自不同的来源(C ++ x0,C ++ 11,Boost)?但我编译了test.o,其中包含了Boost标头,并且启用了c ++ 11。
有任何推理差异的好建议吗?