QuantLib SWIG Java:未定义的交易品种 sessionId()

QuantLib SWIG Java: Undefined symbol sessionId()

我已经使用 --enable-sessions 和 --enable-thread-safe-observer-pattern 标志在 Ubuntu 上成功编译了 QuantLib 1.12。我还编译了 java Swig 绑定。当我尝试 运行 java 中的 Bonds 示例时,我在 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 的参考资料。我不确定该怎么做。我可以在 ql/ 文件夹下添加 "mysessions.cpp" 文件并像往常一样构建 QuantLib 吗?文件 mysessions.cpp 将包含以下内容:

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

感谢您的帮助。

是的,将您的文件添加到构建中即可;为此,您必须将它添加到 ql/Makefile.am 中的文件列表中(您使用的是 Linux 或 Mac 系统,对吧?)。您可能需要安装 autoconfautomake。此外,您可能需要 运行 ./autogen.sh 使用您的工具版本重新初始化 configure 缓存。

谢谢路易吉。我能够让它工作。这里有一些重要的步骤: 我正在使用托管在 Windows 10.

上的 Oracle VirtualBox Ubuntu 16.04.3

在包含boost/lexical_cast.hpp和boost/thread.hpp

后,在ql/patterns文件夹下创建一个mysessions.cpp文件如下
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()的return参数从Integer改为unsigned long。很多地方要改,还有很多地方instances_map的key从Integer改成unsigned long。

将myssesions.cpp添加到ql/patterns/Makefile.am

cpp_files = \
      observable.cpp \
      mysessions.cpp

在Ubuntu16.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