Ошибка ссылки примера OpenVDB 5.1.0 Hello World на Mac
Я пробовал разные способы запустить пример hello world из кулинарной книги openvdb для последней версии 5.1.0. Но я продолжаю получать Undefined symbols for architecture x86_64
ошибка на моем MacBook Pro (MacOS High Sierra 10.13.4).
Чтобы сузить проблему, я упрощаю пример "Привет, мир", как:
//test.cpp
#include <openvdb/openvdb.h>
#include <iostream>
int main()
{
openvdb::initialize();
}
Чтобы скомпилировать код, я установил openvdb 5.1.0 с помощью homebrew 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
В lib нет включенной реализации функции. Я что-то пропустил?
Я также пытался скомпилировать из openvdb git v5.1.0. Другие зависимые пакеты устанавливаются через homebrew (из c-blosc git извлекается только blosc). Однако ошибка та же.
Кто-нибудь испытывает ту же проблему при запуске openvdb 5.1.0 на Mac?
Обновление:
Я пытаюсь использовать nm
выяснить, находится ли символ внутри test.o (используйте ту же команду компиляции без ссылки на какую-либо библиотеку) внутри openvdb.dylib
, Мой целевой символ здесь simplify
, Вывод как показано ниже:
$ nm -A test.o | grep упростить
test.o: U __ZN7openvdb4v5_14math8simplifyESt10 shared_ptrINS1_9AffineMapEE
$ nm -A libopenvdb.dylib | grep упростить
libopenvdb.dylib: 0000000000027a2a T __ZN7openvdb4v5_14math8simplifyENSt3__110 shared_ptrINS1_9AffineMapEEE
$ nm -A git5.1.0 / libopenvdb.dylib | grep упростить
libopenvdb.dylib: 00000000000d56c0 T __ZN7openvdb8v5_1abi34 math8simplifyEN5boost10 shared_ptrINS1_9AffineMapEEE
(Я удалил путь для лучшей читаемости)
Это оно! Я выделил три различия. Я не знаю точного значения выделенной части. Я предполагаю, что shared_ptr в трех файлах происходит из разных источников (C++x0,C++11,Boost)? Но я компилирую test.o с включенным заголовком Boost и включенным C++ 11.
Любое хорошее предложение для обоснования разницы?