Я пытаюсь скомпилировать часть регулярных выражений библиотеки boost C ++ в AIX с использованием компилятора xlC и использовать ее в качестве 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 выпустила патч для исходного кода для повышения:
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
флаг для компиляции только части регулярного выражения, но это не имеет отношения к моим проблемам.
С обеими версиями, с исправлением исходного кода надстройки или без него, я сталкиваюсь с одинаковыми проблемами.
ПервыйУ меня уже есть некоторые библиотеки, скомпилированные и связанные с моим простым тестовым приложением, например, библиотека регулярных выражений PCRE C ++. Когда я также пытаюсь связать библиотеку Boost Regex, с -lboost_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;
}
Как можно решить эти проблемы? Любые советы или рекомендации будут оценены.
Я нашел решение для обеих моих проблем.
Проблема со ссылками:
Я нашел этот пост:
https://durgaprasad.wordpress.com/2006/09/28/problems-with-linking-of-shared-libraries-in-aix/
В нем подробно описано, что в AIX общие библиотеки могут иметь суффиксы .so и .a, а также дать указание компилятору искать файлы .so, которые вам нужно будет включить. -brtl
флаг. Он также дает указание включить -Wl
флаг, чтобы передать флаги связывания непосредственно компоновщику (ld), но я обнаружил, что с этой версией xlC эта функциональность устарела.
Проблема с кодом:
Инструкция препроцессора #define __IBMCPP_TR1__ 1
вызвал сбой библиотеки регулярных выражений с ошибкой компиляции. Это определение было необходимо только для встроенных регулярных выражений tr1 AIX, который я также использую, но оказывается, что он требуется только для #include <regex>
часть, я могу опустить второе определение.
Других решений пока нет …