Mac上的OpenVDB 5.1.0 Hello World示例链接错误

时间:2018-06-13 06:15:52

标签: linker-errors debug-symbols dylib unresolved-external openvdb

我尝试了不同的方法来从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。

有任何推理差异的好建议吗?

0 个答案:

没有答案