2015-06-01 2 views
2

Я пытаюсь скомпилировать аддон C++, который использует внешнюю библиотеку. Мой файл bindings.gyp выглядит следующим образом:Ошибка: undefined symbol: omp_init_lock только при компиляции с node-gyp

{ 
    "targets": [ 
    { 
     "target_name": "addon", 
     "sources": [ "addon.cc" ], 
     "include_dirs": [ 
     "<!(node -e \"require('nan')\")" 
     ], 
     "libraries":[ 
     "/home/ubuntu/workspace/libdds.a" 
     ],   
    } 
    ] 
} 

Когда я пытаюсь скомпилировать его с узлом-плут, он отлично компилируется, но во время выполнения я получаю следующее сообщение об ошибке:

Error: /home/ubuntu/workspace/build/Release/addon.node: undefined symbol: omp_init_lock 
    at Error (native) 
    at Module.load (module.js:355:32) 
    at Function.Module._load (module.js:310:12) 
    at Module.require (module.js:365:17) 
    at require (module.js:384:17) 
    at Object.<anonymous> (/home/ubuntu/workspace/addon.js:1:75) 
    at Module._compile (module.js:460:26) 
    at Object.Module._extensions..js (module.js:478:10) 
    at Module.load (module.js:355:32) 
    at Function.Module._load (module.js:310:12) 

omp_int_lock не в коде addon.cc, но вместо этого в библиотеке libdds.a, которую я пытаюсь использовать. Я попытался взять свой код и просто преобразовать его в программу командной строки. Составив его так:

g++ -o ddsolver -O2 -Wall leadsolver.cpp libdds.a -lgomp 

Он компилируется и работает отлично. Кто-нибудь видел эту проблему раньше?

ответ

2

Похоже, что ваша внешняя библиотека libdds.a использует OpenMP для параллельного выполнения, и поскольку она статически связана, вам необходимо предоставить -lgomp для разрешения всех зависимостей.

Я думаю, вы также можете скомпилировать его с помощью -fopenmp вместо -lgomp