1

我尝试了不同的方法来运行最新版本 5.1.0的 openvdb食谱中的 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 安装了 openvdb 5.1.0 brew install openvdb。我用来编译代码的命令行是(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库没有包含功能实现。我错过了什么?

我还尝试从 openvdb git v5.1.0 编译其他依赖包是通过自制软件安装的(只有 blosc 是从 c-blosc git中提取的)。但是,错误是相同的。

有人在 Mac 上运行 openvdb 5.1.0 时遇到同样的问题吗?

更新

我尝试使用nm来确定 test.o 中的符号(使用相同的编译命令而不引用任何库)是否在 .o 中openvdb.dylib。我的目标符号是simplify. 输出如下:

$ nm -A test.o | grep 简化

test.o: U __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。

对于推理差异有什么好的建议吗?

4

0 回答 0