QuantLib SWIG Java: неопределенный символ sessionId()

Я успешно скомпилировал QuantLib 1.12 на Ubuntu с флагами --enable-sessions и --enable-thread-safe-observer-pattern. Я также скомпилировал привязки java Swig. Когда я пытаюсь запустить пример Bonds в java, я получаю ошибку неопределенного символа в sessionId().

java -cp ./QuantLib.jar:. -Djava.library.path=/usr/local/lib examples.Bond

java:symbol lookup error:/usr/local/lib/libQuantLibJNI.so:undefined 
symbol:_ZN8QuantLib9sessionIdEV

Любая идея, как решить эту ошибку? Я видел несколько ссылок на внешнюю реализацию функции sessionId() и ссылку на QuantLib. Я не уверен, как именно это сделать. Могу ли я добавить файл «mysessions.cpp» в папку ql/ и собрать QuantLib как обычно? Файл mysessions.cpp будет иметь следующее содержимое:

#include <thread>
int QuantLib::sessionId(void)
{
     return std::this_thread::get_id().hash();
}

Спасибо за вашу помощь.


person suhasghorp    schedule 13.03.2018    source источник


Ответы (2)


Да, добавление вашего файла в сборку будет работать; для этого вам нужно будет добавить его в список файлов в ql/Makefile.am (вы работаете в системе Linux или Mac, верно?). Возможно, вам потребуется установить autoconf и automake. Кроме того, вам, возможно, придется запустить ./autogen.sh для повторной инициализации кэша configure с вашими версиями инструментов.

person Luigi Ballabio    schedule 15.03.2018
comment
Добавление нового файла в папку ql/ требует внесения изменений в Makefile, и make не работает, поскольку Ubuntu16 имеет версию 15 automake, а QL make требует версии 15.0.1, которая недоступна для установки apt-get. Поэтому я решил поместить файл mysession.cpp в папку ql/patterns, поэтому в makefile никаких изменений. Я также изменил sessionId, чтобы он возвращал unsigned long для соответствия boost/thread. Я все еще получаю ошибку неопределенного символа. 1. Нужно ли включать #include singleton.hpp в мой файл mysessions.cpp, поскольку именно там я предоставляю определение? 2. Нужно ли мне изменять какие-либо файлы swig .i, поставляемые с архивом? Спасибо. - person suhasghorp; 17.03.2018
comment
Если вы сохраните его в ql/patterns, вам нужно добавить его в ql/patterns/Makefile.am. Нет никакого способа обойти это. Ваш automake должен быть в порядке; см. мое обновление к ответу. - person Luigi Ballabio; 17.03.2018

Спасибо, Луиджи. Я смог заставить его работать. вот несколько важных шагов: я работал с Oracle VirtualBox Ubuntu 16.04.3, размещенным в Windows 10.

Создайте файл mysessions.cpp в папке ql/patterns, как показано ниже, после включения boost/lexical_cast.hpp и boost/thread.hpp.

namespace QuantLib {
  unsigned long sessionId(){
    std::string threadId = boost::lexical_cast<std::string>
    (boost::this_thread::get_id());
    unsigned long threadNumber = 0;
    sscanf(threadId.c_str(), "%lx", &threadNumber);
    return threadNumber;
  }
}

В singleton.hpp измените возвращаемый параметр sessionId() с Integer на unsigned long. Вы должны измениться во многих местах, а также изменить ключ instances_map с Integer на unsigned long во многих местах.

Добавьте myssesions.cpp в ql/patterns/Makefile.am

cpp_files = \
      observable.cpp \
      mysessions.cpp

В Ubuntu 16.04.3 LTS версия automake — 1.15, и ее необходимо обновить до 1.15.1 следующим образом.

sudo apt-get remove automake #remove 1.15
wget http://ftp.gnu.org/gnu/automake/automake-1.15.1.tar.gz
tar xf automake*
cd automake-1.15.1
sh configure --prefix /usr/local
make install

При сборке QuantLib на этапе настройки команда должна быть следующей:

sudo ./configure --disable-static CXXFLAGS=-O3  
--enable-thread-safe-observer-pattern --enable-sessions
person suhasghorp    schedule 17.03.2018