Я успешно скомпилировал 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();
}

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

0
suhasghorp 13 Мар 2018 в 23:37

2 ответа

Лучший ответ

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

0
Luigi Ballabio 17 Мар 2018 в 18:25

Спасибо, Луиджи. Я смог заставить его работать. вот несколько важных шагов: я работал с 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. Вы должны изменить во многих местах, также измените ключ instance_ 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
0
suhasghorp 17 Мар 2018 в 19:30