我正在尝试使用 xlC 编译器在 AIX 上编译 boost C++ 库的正则表达式部分并将其用作 64 位动态库,因为我需要比较几个 C++ 正则表达式库和内置解决方案的性能,并提升似乎是一个可行的候选人。
这是我的确切操作系统和编译器版本:
$ uname -a
AIX host_name 1 7 00F9A2144C00
$ xlC -qversion
IBM XL C/C++ for AIX, V13.1.2 (5725-C72, 5765-J07)
Version: 13.01.0002.0000
由于我没有 root 权限,因此我实际上无法安装 boost 库,我只是尝试将正则表达式部分编译为共享对象文件并获取我的测试应用程序所需的所有头文件。我尝试编译了最新的可用版本(1.59.0),还有1.55.0版本,因为我发现IBM已经发布了一个用于boost的源代码补丁:
http://www-01.ibm.com/support/docview.wss?uid=swg27042921
我使用以下命令编译 boost 并将标头和共享对象文件复制到我的开发文件夹:
bootstrap.sh --with-toolset=vacpp --prefix=/my/user/directory --exec-prefix=/my/user/directory
./b2 address-model=64 cxxflags=-q64 cflags=-q64
b2 tools/bcp
./dist/bin/bcp boost/regex.hpp /my/include/directory
cp stage/lib/libboost_regex.so /my/library/directory
我知道我可以添加--with-libraries=regex
标志来仅编译正则表达式部分,但这与我的问题无关。
对于这两个版本,无论是否修补了 boost 源代码,我都会遇到同样的问题。
首先:我已经编译了一些库,并链接到我的简单测试应用程序,例如 PCRE C++ 正则表达式库。当我还尝试使用-lboost_regex
编译标志链接 boost regex 库时,我收到以下错误:
ld: 0706-006 Cannot find or open library file: -l boost_regex
ld:open(): No such file or directory
make: The error code from the last command is 255.
这可以通过添加-brtl
编译标志来解决,据我所知,只有在我尝试链接静态库时才需要它,所以在我看来 libboost_regex.so 实际上是 libboost_regex.a
第二:当我将这一行添加#include "boost/regex.hpp"
到我的代码中时,我得到一个编译错误:
"/opt/IBM/xlC/13.1.2/include/xtr1common", line 217.19: 1540-0130 (S) "false_type" is not declared.
"/opt/IBM/xlC/13.1.2/include/xtr1common", line 223.19: 1540-0130 (S) "true_type" is not declared.
"/opt/IBM/xlC/13.1.2/include/xtr1common", line 229.19: 1540-0130 (S) "true_type" is not declared.
"/opt/IBM/xlC/13.1.2/include/xtr1common", line 235.19: 1540-0130 (S) "true_type" is not declared.
"/opt/IBM/xlC/13.1.2/include/xtr1common", line 244.11: 1540-0130 (S) "false_type" is not declared.
"/opt/IBM/xlC/13.1.2/include/xtr1common", line 250.11: 1540-0130 (S) "true_type" is not declared.
make: The error code from the last command is 1.
我的测试应用程序非常简单。这些是我的 Makefile 的内容:
all:
/opt/IBM/xlC/13.1.2/bin/xlC -q64 -Iinclude -Llibs -lpcrecpp main.cpp -o regexp_test
clean:
rm regexp_test
这是我非常基本的测试应用程序的源代码:
#include <iostream>
#include <string.h>
#ifndef __IBMCPP_TR1__
#define __IBMCPP_TR1__ 1
#include <regex>
#undef __IBMCPP_TR1__
#endif
#define __IBMCPP_TR1__ 1
/* Regular expression libraries to be included */
#include <sys/types.h>
#include <regex.h>
#include "pcrecpp.h"
// #include "boost/regex.hpp"
#include "deelx.h"
int main(int argc, char **argv)
{
if(argc != 4){
std::cerr << "Use: ./regexp_test <posix|tr1|pcre|deelx> value regexp" << std::endl;
return 1;
}
int status;
char buffer[256], regexp[256];
snprintf(buffer,sizeof(buffer),argv[2]);
snprintf(regexp,sizeof(regexp),argv[3]);
std::string buffer_string = buffer;
bool match = false;
if(strcmp(argv[1],"posix")==0){
regex_t comp;
if (regcomp(&comp, regexp, REG_EXTENDED) != 0) {
std::cerr << "The regular expression '" << regexp << "' could not be compiled!" << std::endl;
return 1;
} else {
status = regexec(&comp, buffer, (size_t) 0, NULL, 0);
regfree(&comp);
if (status == 0) {
match = true;
}
}
} else if(strcmp(argv[1],"tr1")==0){
try {
std::tr1::smatch matches;
std::tr1::regex rgx(regexp);
status = std::tr1::regex_search(buffer_string, matches, rgx);
if(status){
match = true;
}
}
catch(std::tr1::regex_error& re)
{
std::cerr << "TR1 exception caught!" << std::endl;
}
} else if(strcmp(argv[1],"pcre")==0){
pcrecpp::RE re(regexp);
if(re.PartialMatch(buffer)){
match = true;
}
} else if(strcmp(argv[1],"deelx")==0){
static CRegexpT <char> deelx_regexp(regexp, IGNORECASE | MULTILINE);
MatchResult result = deelx_regexp.Match(buffer);
if(result.IsMatched()){
match = true;
}
} else {
std::cerr << "Use: ./regexp_test <posix|tr1|pcre|deelx> value regexp" << std::endl;
return 1;
}
if (!match) {
std::cout << "The regular expression '" << regexp << "' does NOT match the value '" << buffer << "'." << std::endl;
} else {
std::cout << "The regular expression '" << regexp << "' matches the value '" << buffer << "'." << std::endl;
}
return 0;
}
如何解决这些问题?任何提示或建议将不胜感激。