Ошибка ссылки примера OpenVDB 5.1.0 Hello World на Mac - PullRequest
0 голосов
/ 13 июня 2018

Я пробовал разные способы запуска примера hello world из openvdb cookbook для последней версии 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 * извлекается только blosc1022 *).Однако ошибка та же.

Кто-нибудь испытывает ту же проблему при запуске openvdb 5.1.0 на Mac?

Обновление :

Iпопробуйте использовать nm, чтобы выяснить, находится ли символ внутри test.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 * 10,15 * db * * *grep упрощение

libopenvdb.dylib: 00000000000d56c0 T __ZN7openvdb8v5_ 1abi34 math8simplify EN5boost10 shared_ptrINS1_9AffineMap * * 10 * 10 * 10 1060 *

*1060* * * * 10 *1060* * * * 10 *1060* * * * 10 *1060* * * * 10 *1060* *1060* * 1060путь для лучшей читаемости)

Вот и все!Я выделил три различия.Я не знаю точного значения выделенной части.Я предполагаю, что shared_ptr в трех файлах происходит из разных источников (C ++ x0, C ++ 11, Boost)?Но я компилирую test.o с включенным заголовком Boost и включенным c ++ 11.

Любое хорошее предложение для обоснования разницы?

...