QuickFix C++:编译接受器时出错
QuickFix C++: Errors when compiling Acceptor
目标:
编译“Acceptor”程序(服务器)。完成后,编译一个“启动器”(客户端),然后打印一个简单的输出,以确认这两个应用程序正在相互通信(我已经通读了 QuickFix 文档并且基本上理解了其中的要求)。
请注意 在发布此问题之前,QuickFix 邮件列表和 SO 已被查阅。有类似问题的问题可以在下面URL找到,但是,答案仍然让我有些困惑:
Compiling a quickfix program
问题:
当试图编译完全从 http://www.quickfixengine.org/quickfix/doc/html/application.html 复制的以下示例 Acceptor 程序时,出现了各种错误,如下所示。我使用的编译命令是:
g++ trade_server_test.cpp -std=c++11 -fexceptions -finline-functions -lquickfix -lpthread -lxml2
程序:
#include "quickfix/FileStore.h"
#include "quickfix/FileLog.h"
#include "quickfix/SocketAcceptor.h"
#include "quickfix/Session.h"
#include "quickfix/SessionSettings.h"
#include "quickfix/Application.h"
int main( int argc, char** argv )
{
try
{
if(argc < 2) return 1;
std::string fileName = argv[1];
FIX::SessionSettings settings(fileName);
MyApplication application;
FIX::FileStoreFactory storeFactory(settings);
FIX::FileLogFactory logFactory(settings);
FIX::SocketAcceptor acceptor
(application, storeFactory, settings, logFactory /*optional*/);
acceptor.start();
// while( condition == true ) { do something; }
acceptor.stop();
return 0;
}
catch(FIX::ConfigError& e)
{
std::cout << e.what();
return 1;
}
}
错误输出
观察到以下错误:
trade_server_test.cpp: In function ‘int main(int, char**)’:
trade_server_test.cpp:17:3: error: ‘MyApplication’ was not declared in this scope
MyApplication application;
^~~~~~~~~~~~~
trade_server_test.cpp:21:6: error: ‘application’ was not declared in this scope
(application, storeFactory, settings, logFactory /*optional*/);
然后我将对象名称从 "MyApplication"
修改为 "Application"
,并收到以下错误输出。 “应用程序”class 在头文件 Application.h
中定义。编译器识别所有包含的头文件,所以我很困惑为什么它说“应用程序”没有在此范围内声明。
trade_server_test.cpp: In function ‘int main(int, char**)’:
trade_server_test.cpp:17:3: error: ‘Application’ was not declared in this scope
Application application;
^~~~~~~~~~~
trade_server_test.cpp:17:3: note: suggested alternative:
In file included from /usr/local/include/quickfix/Acceptor.h:29:0,
from /usr/local/include/quickfix/SocketAcceptor.h:29,
from trade_server_test.cpp:3:
/usr/local/include/quickfix/Application.h:43:7: note: ‘FIX::Application’
class Application
^~~~~~~~~~~
trade_server_test.cpp:21:6: error: ‘application’ was not declared in this scope
(application, storeFactory, settings, logFactory /*optional*/);
^~~~~~~~~~~
再次将对象从 "Application"
更改为 "FIX::NullApplication"
消除了上述错误,但随后出现了新错误:
/usr/bin/ld: cannot find -lxml2
collect2: error: ld returned 1 exit status
我已经在 Ubuntu 18.04.2 LTS
上成功下载并构建了 QuickFix 1.15.1
,并且能够 运行 一些示例应用程序,例如OrderMatch
和 TradeClient
(尽管只有部分功能)按照以下步骤操作:
% tar xvzf quickfix-1.15.1.tar.gz
% cd quickfix
% ./bootstrap
% ./configure
% make
% sudo make install
总结性问题
- 如何在
Ubuntu 18.04.2 LTS
上为 QuickFix 1.15.1
成功编译示例 Acceptor 程序?在 link 的库、使用哪些标志编译的头文件等方面的分步指南将受到高度赞赏
- 编译命令看起来正确吗?
- 任何头文件是否应该与此应用程序一起编译(尽管我认为在
building
过程中 make
为 运行 时这些文件会被编译?
需要自己提供Application的子类
让我们看一下Application的声明:
namespace FIX
{
class Application
{
public:
virtual ~Application() {};
virtual void onCreate( const SessionID& ) = 0;
virtual void onLogon( const SessionID& ) = 0;
virtual void onLogout( const SessionID& ) = 0;
virtual void toAdmin( Message&, const SessionID& ) = 0;
virtual void toApp( Message&, const SessionID& )
throw( DoNotSend ) = 0;
virtual void fromAdmin( const Message&, const SessionID& )
throw( FieldNotFound, IncorrectDataFormat, IncorrectTagValue, RejectLogon ) = 0;
virtual void fromApp( const Message&, const SessionID& )
throw( FieldNotFound, IncorrectDataFormat, IncorrectTagValue, UnsupportedMessageType ) = 0;
};
}
所有这些标有= 0
的方法都是纯虚函数:它们没有实现,你不能直接实例化FIX::Application
。相反,您必须声明一个子类。 在哪里 执行此操作并不重要,只要在创建 MyApplication
实例时声明在范围内即可。这可以在同一个文件中,也可以在您包含的头文件中。
一个什么都不做的简单的 Application 子类可能如下所示:
class MyApplication : public FIX::Application
{
void onCreate( const SessionID& ) { std::cout << "onCreate" << std::endl; }
void onLogon( const SessionID& ) { std::cout << "onLogon" << std::endl; }
void onLogout( const SessionID& ) { std::cout << "onLogout" << std::endl; }
void toAdmin( Message&, const SessionID& ) { std::cout << "toAdmin" << std::endl; }
void toApp( Message&, const SessionID& ) throw( DoNotSend ) { std::cout << "toApp" << std::endl; }
void fromAdmin( const Message&, const SessionID& ) throw( FieldNotFound, IncorrectDataFormat, IncorrectTagValue, RejectLogon ) { std::cout << "fromAdmin" << std::endl; }
void fromApp( const Message&, const SessionID& ) throw( FieldNotFound, IncorrectDataFormat, IncorrectTagValue, UnsupportedMessageType ) { std::cout << "fromApp" << std::endl; }
};
目标:
编译“Acceptor”程序(服务器)。完成后,编译一个“启动器”(客户端),然后打印一个简单的输出,以确认这两个应用程序正在相互通信(我已经通读了 QuickFix 文档并且基本上理解了其中的要求)。
请注意 在发布此问题之前,QuickFix 邮件列表和 SO 已被查阅。有类似问题的问题可以在下面URL找到,但是,答案仍然让我有些困惑: Compiling a quickfix program
问题:
当试图编译完全从 http://www.quickfixengine.org/quickfix/doc/html/application.html 复制的以下示例 Acceptor 程序时,出现了各种错误,如下所示。我使用的编译命令是:
g++ trade_server_test.cpp -std=c++11 -fexceptions -finline-functions -lquickfix -lpthread -lxml2
程序:
#include "quickfix/FileStore.h"
#include "quickfix/FileLog.h"
#include "quickfix/SocketAcceptor.h"
#include "quickfix/Session.h"
#include "quickfix/SessionSettings.h"
#include "quickfix/Application.h"
int main( int argc, char** argv )
{
try
{
if(argc < 2) return 1;
std::string fileName = argv[1];
FIX::SessionSettings settings(fileName);
MyApplication application;
FIX::FileStoreFactory storeFactory(settings);
FIX::FileLogFactory logFactory(settings);
FIX::SocketAcceptor acceptor
(application, storeFactory, settings, logFactory /*optional*/);
acceptor.start();
// while( condition == true ) { do something; }
acceptor.stop();
return 0;
}
catch(FIX::ConfigError& e)
{
std::cout << e.what();
return 1;
}
}
错误输出
观察到以下错误:
trade_server_test.cpp: In function ‘int main(int, char**)’:
trade_server_test.cpp:17:3: error: ‘MyApplication’ was not declared in this scope
MyApplication application;
^~~~~~~~~~~~~
trade_server_test.cpp:21:6: error: ‘application’ was not declared in this scope
(application, storeFactory, settings, logFactory /*optional*/);
然后我将对象名称从 "MyApplication"
修改为 "Application"
,并收到以下错误输出。 “应用程序”class 在头文件 Application.h
中定义。编译器识别所有包含的头文件,所以我很困惑为什么它说“应用程序”没有在此范围内声明。
trade_server_test.cpp: In function ‘int main(int, char**)’:
trade_server_test.cpp:17:3: error: ‘Application’ was not declared in this scope
Application application;
^~~~~~~~~~~
trade_server_test.cpp:17:3: note: suggested alternative:
In file included from /usr/local/include/quickfix/Acceptor.h:29:0,
from /usr/local/include/quickfix/SocketAcceptor.h:29,
from trade_server_test.cpp:3:
/usr/local/include/quickfix/Application.h:43:7: note: ‘FIX::Application’
class Application
^~~~~~~~~~~
trade_server_test.cpp:21:6: error: ‘application’ was not declared in this scope
(application, storeFactory, settings, logFactory /*optional*/);
^~~~~~~~~~~
再次将对象从 "Application"
更改为 "FIX::NullApplication"
消除了上述错误,但随后出现了新错误:
/usr/bin/ld: cannot find -lxml2
collect2: error: ld returned 1 exit status
我已经在 Ubuntu 18.04.2 LTS
上成功下载并构建了 QuickFix 1.15.1
,并且能够 运行 一些示例应用程序,例如OrderMatch
和 TradeClient
(尽管只有部分功能)按照以下步骤操作:
% tar xvzf quickfix-1.15.1.tar.gz
% cd quickfix
% ./bootstrap
% ./configure
% make
% sudo make install
总结性问题
- 如何在
Ubuntu 18.04.2 LTS
上为QuickFix 1.15.1
成功编译示例 Acceptor 程序?在 link 的库、使用哪些标志编译的头文件等方面的分步指南将受到高度赞赏 - 编译命令看起来正确吗?
- 任何头文件是否应该与此应用程序一起编译(尽管我认为在
building
过程中make
为 运行 时这些文件会被编译?
需要自己提供Application的子类
让我们看一下Application的声明:
namespace FIX
{
class Application
{
public:
virtual ~Application() {};
virtual void onCreate( const SessionID& ) = 0;
virtual void onLogon( const SessionID& ) = 0;
virtual void onLogout( const SessionID& ) = 0;
virtual void toAdmin( Message&, const SessionID& ) = 0;
virtual void toApp( Message&, const SessionID& )
throw( DoNotSend ) = 0;
virtual void fromAdmin( const Message&, const SessionID& )
throw( FieldNotFound, IncorrectDataFormat, IncorrectTagValue, RejectLogon ) = 0;
virtual void fromApp( const Message&, const SessionID& )
throw( FieldNotFound, IncorrectDataFormat, IncorrectTagValue, UnsupportedMessageType ) = 0;
};
}
所有这些标有= 0
的方法都是纯虚函数:它们没有实现,你不能直接实例化FIX::Application
。相反,您必须声明一个子类。 在哪里 执行此操作并不重要,只要在创建 MyApplication
实例时声明在范围内即可。这可以在同一个文件中,也可以在您包含的头文件中。
一个什么都不做的简单的 Application 子类可能如下所示:
class MyApplication : public FIX::Application
{
void onCreate( const SessionID& ) { std::cout << "onCreate" << std::endl; }
void onLogon( const SessionID& ) { std::cout << "onLogon" << std::endl; }
void onLogout( const SessionID& ) { std::cout << "onLogout" << std::endl; }
void toAdmin( Message&, const SessionID& ) { std::cout << "toAdmin" << std::endl; }
void toApp( Message&, const SessionID& ) throw( DoNotSend ) { std::cout << "toApp" << std::endl; }
void fromAdmin( const Message&, const SessionID& ) throw( FieldNotFound, IncorrectDataFormat, IncorrectTagValue, RejectLogon ) { std::cout << "fromAdmin" << std::endl; }
void fromApp( const Message&, const SessionID& ) throw( FieldNotFound, IncorrectDataFormat, IncorrectTagValue, UnsupportedMessageType ) { std::cout << "fromApp" << std::endl; }
};