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 系统,对吧?)。您可能需要安装 autoconf
和 automake
。此外,您可能需要 运行 ./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
我已经使用 --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 系统,对吧?)。您可能需要安装 autoconf
和 automake
。此外,您可能需要 运行 ./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