TL;DR: Как использовать FBExport в Ubuntu / как экспортировать результат запроса Firebird в файл csv.
Я хотел бы экспортировать результат запроса из базы данных firebird в файл csv.
В Windows я делаю аналогичную работу, используя FBExport.
К сожалению, я не знаю, как использовать этот инструмент в Ubuntu.
Я скачал пак с http://www.firebirdfaq.org/fbexport.php
Когда я пытаюсь запустить ./fbexport, я получаю сообщение об ошибке:
./fbexport: ошибка при загрузке разделяемых библиотек: libfbclient.so.2:
не удается открыть общий объектный файл: нет такого файла или каталога
Также я попытался скомпилировать пакет.
Сначала я изменил делать
файл из:
################################################### ##############################
.СУФФИКСЫ: .o .cpp
OBJECTS_FBE=fbexport/ParseArgs.o fbexport/FBExport.o fbexport/cli-main.o
OBJECTS_FBC=fbcopy/args.o fbcopy/fbcopy.o fbcopy/TableDependency.o fbcopy/main.o
# Флаги компилятора и компоновщика
COMPILE_FLAGS=-O1 -DIBPP_LINUX -DIBPP_GCC -Iibpp
LINK_FLAGS=-pthread -lfbclient
#COMPILE_FLAGS=-O1 -DIBPP_WINDOWS -DIBPP_GCC -Iibpp
#LINK_FLAGS=
все: exe/fbcopy exe/fbexport
exe/fbexport: $(OBJECTS_FBE) ibpp/all_in_one.o
g++ $(LINK_FLAGS) ibpp/all_in_one.o $(OBJECTS_FBE) -oexe/fbexport
exe/fbcopy: $(OBJECTS_FBC) ibpp/all_in_one.o
g++ $(LINK_FLAGS) ibpp/all_in_one.o $(OBJECTS_FBC) -oexe/fbcopy
# только линукс
# FB2.0: g++ -pthread -lfbclient $(OBJECTS) -o$(EXENAME)
# FB1.5: g++ -lfbclient $(OBJECTS) -o$(EXENAME)
# FB1.0: g++ -lgds -lcrypt -lm $(OBJECTS) -o$(EXENAME)
установить:
установить exe/fbcopy /usr/bin/fbcopy
установить exe/fbexport /usr/bin/fbexport
.cpp.о:
g++ -c $(COMPILE_FLAGS) -o $@ $<
чистый:
rm -f fbcopy/*.o
rm -f ibpp/all_in_one.o
rm -f exe/fbcopy*
rm -f fbexport/*.o
rm -f exe/fbexport*
#EOF
к:
################################################### ##############################
.СУФФИКСЫ: .o .cpp
OBJECTS_FBE=fbexport/ParseArgs.o fbexport/FBExport.o fbexport/cli-main.o
# Флаги компилятора и компоновщика
COMPILE_FLAGS=-O1 -DIBPP_LINUX -DIBPP_GCC -Iibpp
LINK_FLAGS=-pthread -lfbclient
#COMPILE_FLAGS=-O1 -DIBPP_WINDOWS -DIBPP_GCC -Iibpp
#LINK_FLAGS=
все: exe/fbexport
exe/fbexport: $(OBJECTS_FBE) ibpp/all_in_one.o
g++ $(LINK_FLAGS) ibpp/all_in_one.o $(OBJECTS_FBE) -oexe/fbexport
# только линукс
# FB2.0: g++ -pthread -lfbclient $(OBJECTS) -o$(EXENAME)
# FB1.5: g++ -lfbclient $(OBJECTS) -o$(EXENAME)
# FB1.0: g++ -lgds -lcrypt -lm $(OBJECTS) -o$(EXENAME)
установить:
установить exe/fbexport /usr/bin/fbexport
.cpp.о:
g++ -c $(COMPILE_FLAGS) -o $@ $<
чистый:
rm -f ibpp/all_in_one.o
rm -f fbexport/*.o
rm -f exe/fbexport*
#EOF
(потому что мне нравится компилировать только FBExport (исключая FBCopy))
После этого изменения я попытался запустить делать
в основной папке.
Вывод:
user@apiserver:~/fbexport-1.90$ сделать
g++ -c -O1 -DIBPP_LINUX -DIBPP_GCC -Iibpp -o fbexport/ParseArgs.o fbexport/ParseArgs.cpp
g++ -c -O1 -DIBPP_LINUX -DIBPP_GCC -Iibpp -o fbexport/FBExport.o fbexport/FBExport.cpp
fbexport/FBExport.cpp: В функции-члене «std::string FBExport::CreateHumanString(IBPP::Statement&, int)»:
fbexport/FBExport.cpp:318:29: предупреждение: формат «%ld» ожидает аргумент типа «long int», но аргумент 3 имеет тип «int» [-Wformat=]
318 | sprintf(str, "%ld", x);
| ~~^ ~
| | |
| | инт
| длинный внутренний
| %d
fbexport/FBExport.cpp:40:21: предупреждение: формат «%lli» ожидает аргумент типа «long long int», но аргумент 3 имеет тип «int64_t» {также известный как «long» int} [-Wformat=]
40 | #define INT64FORMAT "%lli"
| ^~~~~~
fbexport/FBExport.cpp:351:26: примечание: в расширении макроса «INT64FORMAT»
351 | sprintf(str, INT64FORMAT, int64val);
| ^~~~~~~~~~~~
fbexport/FBExport.cpp:40:25: примечание: здесь определяется строка формата
40 | #define INT64FORMAT "%lli"
| ~~~^
| |
| длинный длинный внутренний
| %li
fbexport/FBExport.cpp: В функции-члене «bool FBExport::CreateString(IBPP::Statement&, int, std::string&)»:
fbexport/FBExport.cpp:429:29: предупреждение: формат «%ld» ожидает аргумент типа «long int», но аргумент 3 имеет тип «int» [-Wformat=]
429 | sprintf(str, "%ld", x);
| ~~^ ~
| | |
| | инт
| длинный внутренний
| %d
fbexport/FBExport.cpp:435:29: предупреждение: формат «%ld» ожидает аргумент типа «long int», но аргумент 3 имеет тип «int» [-Wformat=]
435 | sprintf(str, "%ld", d.GetDate());
| ~~^ ~~~~~~~~~~~~
| | |
| длинный интервал
| %d
fbexport/FBExport.cpp:440:29: предупреждение: формат «%ld» ожидает аргумент типа «long int», но аргумент 3 имеет тип «int» [-Wformat=]
440 | sprintf(str, "%ld", t.GetTime());
| ~~^ ~~~~~~~~~~~~
| | |
| длинный интервал
| %d
fbexport/FBExport.cpp:40:21: предупреждение: формат «%lli» ожидает аргумент типа «long long int», но аргумент 3 имеет тип «int64_t» {также известный как «long» int} [-Wformat=]
40 | #define INT64FORMAT "%lli"
| ^~~~~~
fbexport/FBExport.cpp:462:26: примечание: в расширении макроса «INT64FORMAT»
462 | sprintf(str, INT64FORMAT, int64val);
| ^~~~~~~~~~~~
fbexport/FBExport.cpp:40:25: примечание: здесь определяется строка формата
40 | #define INT64FORMAT "%lli"
| ~~~^
| |
| длинный длинный внутренний
| %li
fbexport/FBExport.cpp: В функции-члене «int FBExport::Export(IBPP::Statement&, FILE*)»:
fbexport/FBExport.cpp:487:18: предупреждение: ISO C++17 не позволяет «зарегистрировать» спецификатор класса хранения [-Wregister]
487 | регистрация int fc = st->Columns();
| ^~
fbexport/FBExport.cpp:491:23: предупреждение: ISO C++17 не позволяет «зарегистрировать» спецификатор класса хранения [-Wregister]
491 | for (зарегистрировать int i=1; i<=fc; i++)
| ^
fbexport/FBExport.cpp:505:27: предупреждение: ISO C++17 не позволяет «зарегистрировать» спецификатор класса хранения [-Wregister]
505 | for (register int i=1; i<=fc; i++) // ... экспортировать все поля в файл.
| ^
fbexport/FBExport.cpp: В функции-члене «int FBExport::ExportHuman(IBPP::Statement&, FILE*)»:
fbexport/FBExport.cpp:829:18: предупреждение: ISO C++17 не позволяет «зарегистрировать» спецификатор класса хранения [-Wregister]
829 | регистрация int fc = st->Columns();
| ^~
fbexport/FBExport.cpp:835:27: предупреждение: ISO C++17 не позволяет «зарегистрировать» спецификатор класса хранилища [-Wregister]
835 | for (register int i=1; i<=fc; i++) // вывод CSV-заголовка.
| ^
fbexport/FBExport.cpp:847:27: предупреждение: ISO C++17 не позволяет «зарегистрировать» спецификатор класса хранения [-Wregister]
847 | for (register int i=1; i<=fc; i++) // ... экспортировать все поля в файл.
| ^
fbexport/FBExport.cpp:860:27: предупреждение: ISO C++17 не позволяет «зарегистрировать» спецификатор класса хранения [-Wregister]
860 | for (register int i=1; i<=fc; i++) // вывод CSV-заголовка.
| ^
fbexport/FBExport.cpp:875:27: предупреждение: ISO C++17 не позволяет «зарегистрировать» спецификатор класса хранения [-Wregister]
875 | for (register int i=1; i<=fc; i++) // ... экспортировать все поля в файл.
| ^
fbexport/FBExport.cpp: В функции «int statement_length(FILE*)»:
fbexport/FBExport.cpp:1335:24: предупреждение: ISO C++17 не позволяет «зарегистрировать» спецификатор класса хранилища [-Wregister]
1335 | регистр int c = 0, tmp = 0;
| ^
fbexport/FBExport.cpp:1335:31: предупреждение: ISO C++17 не позволяет «зарегистрировать» спецификатор класса хранения [-Wregister]
1335 | регистр int c = 0, tmp = 0;
| ^~~
fbexport/FBExport.cpp:1336:24: предупреждение: ISO C++17 не позволяет «зарегистрировать» спецификатор класса хранения [-Wregister]
1336 | регистрировать л = 0;
| ^
fbexport/FBExport.cpp: В функции «char* read_statement(char*, int, FILE*)»:
fbexport/FBExport.cpp:1376:24: предупреждение: ISO C++17 не позволяет «зарегистрировать» спецификатор класса хранения [-Wregister]
1376 | регистр int c = 0, tmp = 0;
| ^
fbexport/FBExport.cpp:1376:31: предупреждение: ISO C++17 не позволяет «зарегистрировать» спецификатор класса хранения [-Wregister]
1376 | регистр int c = 0, tmp = 0;
| ^~~
fbexport/FBExport.cpp:1377:25: предупреждение: ISO C++17 не позволяет «зарегистрировать» спецификатор класса хранения [-Wregister]
1377 | зарегистрируйте символ *P;
| ^
fbexport/FBExport.cpp: В функции-члене «std::string FBExport::CreateHumanString(IBPP::Statement&, int)»:
fbexport/FBExport.cpp:339:17: предупреждение: игнорируется возвращаемое значение «char* gcvt(double, int, char*)», объявленное с атрибутом «warn_unused_result» [-Wunused-result]
339 | gcvt(fval, 19, стр);
| ~~~~^~~~~~~~~~~~~~~~
fbexport/FBExport.cpp:345:17: предупреждение: игнорируется возвращаемое значение «char* gcvt(double, int, char*)», объявленное с атрибутом «warn_unused_result» [-Wunused-result]
345 | гцвт(двал, 19, ул);
| ~~~~^~~~~~~~~~~~~~~~
fbexport/FBExport.cpp: В функции-члене «bool FBExport::CreateString(IBPP::Statement&, int, std::string&)»:
fbexport/FBExport.cpp:452:17: предупреждение: игнорируется возвращаемое значение «char* gcvt(double, int, char*)», объявленное с атрибутом «warn_unused_result» [-Wunused-result]
452 | gcvt(fval, 19, стр);
| ~~~~^~~~~~~~~~~~~~~~
fbexport/FBExport.cpp:457:17: предупреждение: игнорируется возвращаемое значение «char* gcvt(double, int, char*)», объявленное с атрибутом «warn_unused_result» [-Wunused-result]
457 | гцвт(двал, 19, ул);
| ~~~~^~~~~~~~~~~~~~~~
fbexport/FBExport.cpp: В функции-члене «int FBExport::Import(IBPP::Statement&, FILE*)»:
fbexport/FBExport.cpp:706:26: предупреждение: игнорируется возвращаемое значение «size_t fread(void*, size_t, size_t, FILE*)», объявленное с атрибутом «warn_unused_result» [-Wunused-result]
706 | fread(buff, size, 1, fp);
| ~~~~~^~~~~~~~~~~~~~~~~~~~
fbexport/FBExport.cpp: В функции-члене âint FBExport::Init(Arguments*)â:
fbexport/FBExport.cpp:1211:41: предупреждение: â__builtin___sprintf_chkâ может записать завершающий нуль после конца адресата [-Wformat-overflow=]
1211 | sprintf(число, "%d", i+1);
| ^
В файле, включенном из /usr/include/stdio.h:888,
из /usr/include/С++/11/cstdio:42,
из /usr/include/c++/11/ext/string_conversions.h:43,
из /usr/include/c++/11/bits/basic_string.h:6606,
из /usr/include/С++/11/строка: 55,
из ibpp/ibpp.h:91,
из fbexport/FBExport.cpp:44:
/usr/include/x86_64-linux-gnu/bits/stdio2.h:38:34: примечание: «__builtin___sprintf_chk» выводит от 2 до 11 байтов в место назначения размером 10
38 | вернуть __builtin___sprintf_chk (__s, __USE_FORTIFY_LEVEL - 1,
| ~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~
39 | __glibc_objsize (__s), __fmt,
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
40 | __va_arg_pack());
| ~~~~~~~~~~~~~~~~~
g++ -c -O1 -DIBPP_LINUX -DIBPP_GCC -Iibpp -o fbexport/cli-main.o fbexport/cli-main.cpp
g++ -c -O1 -DIBPP_LINUX -DIBPP_GCC -Iibpp -o ibpp/all_in_one.o ibpp/all_in_one.cpp
g++ -pthread -lfbclient ibpp/all_in_one.o fbexport/ParseArgs.o fbexport/FBExport.o fbexport/cli-main.o -oexe/fbexport
Что я могу сделать в этом случае?
С уважением
Томаш