Полная версия этой страницы:
из LInux в Win
Переделываю программу написанную под LInux в Win, запоролся на таком моменте:
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <qapplication.h>
#include <qmessagebox.h>
#include <qlineedit.h>
#include <qstring.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sched.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
не работает :
// Попытаемся создать FIFO в текущей директории
if(mknod(nameOUT, S_IFIFO | 0666, 0) < 0)
{
// Если создать FIFO не удалось, печатаем об этом сообщение и прекращаем работу
perror("BLOCK can\'t create FIFO OUT");
exit(-1);
}
ошибка:
block.cpp:167: error: 'mknod' was not declared in this scope
А где собственно этот самый mknod объявляется? + if(mknod(nameOUT, S_IFIFO | 0666, 0) < 0) жирным выделены права на создаваемый объект в файловой системе. А точнее всем на чтение\изменения.
silver47, на ваш вопрос я не знаю ответа где он объявляеться, но через поиск mknod не находит в в файлах*.h .
По-гуглив, я понял что mknod это чисто Unix функция, можеть быть есть таже функция, но под Window? поправте, если я ошибаюсь.
и еще одна проблемка:
есть код большой код.
в начале кода:
#include <stdio.h>
в конце когда:
_fcloseall();
при сборке выдаются ошибки 42 штуки:
E:\alexprojects\samum\trunk\blockw/blockw.cpp:60: undefined reference to `_imp___ZN12QApplicationC1ERiPPci'
E:\alexprojects\samum\trunk\blockw/blockw.cpp:68: undefined reference to `wr_open(char*)'
E:\alexprojects\samum\trunk\blockw/blockw.cpp:68: undefined reference to `rd_fil(int, za_fil*)'
E:\alexprojects\samum\trunk\blockw/blockw.cpp:68: undefined reference to `rd_spec(int, char*, za_spec*)'
E:\alexprojects\samum\trunk\blockw/blockw.cpp:77: undefined reference to `rd_item(int, za_ptr*, void*)'
.....
E:\alexprojects\samum\trunk\blockw/dos_inblkd.cpp:353: undefined reference to `_imp___Z6qDebugPKcz'
c:/qt/2010.05/mingw/bin/../lib/gcc/mingw32/4.4.0/../../../libmingw32.a(main.o):main.c:(.text+0x104): undefined reference to `WinMain@16'
collect2: ld returned 1 exit status
mingw32-make[1]: *** [debug\blockw.exe] Error 1
mingw32-make: *** [debug] Error 2
а когда просто пишу
fcloseall();
ошибка вот такая:
blockw.cpp: In function 'int qMain(int, char**)':
blockw.cpp:138: error: 'fcloseall' was not declared in this scope
ну это ошибка понятна... вот как с выше указанным бороться, всю голову сломал уже.
Ну так в чем проблема то?
Гугл в помощь.
Смотрите описание функции (что она делает и для чего) и подбирайте аналогичные для Windows,
а если аналогичных нет - то по смыслу и функциональным возможностям заменяйте на другие.
Но для этого сначала нужно досконально разобраться с той программкой, которую портируете,
т.е. что она делает, что делают эти POSIX функции и т.п.
без этого - никуда.
Цитата(TiiL @ 7.7.2011, 17:20)

E:\alexprojects\samum\trunk\blockw/blockw.cpp:60: undefined reference to `_imp___ZN12QApplicationC1ERiPPci'
E:\alexprojects\samum\trunk\blockw/blockw.cpp:68: undefined reference to `wr_open(char*)'
E:\alexprojects\samum\trunk\blockw/blockw.cpp:68: undefined reference to `rd_fil(int, za_fil*)'
E:\alexprojects\samum\trunk\blockw/blockw.cpp:68: undefined reference to `rd_spec(int, char*, za_spec*)'
E:\alexprojects\samum\trunk\blockw/blockw.cpp:77: undefined reference to `rd_item(int, za_ptr*, void*)'
Не похоже на стандартные функции, никаких .h и .cpp файлов к проекту подключить не забыли?
Цитата(TiiL @ 7.7.2011, 17:20)

c:/qt/2010.05/mingw/bin/../lib/gcc/mingw32/4.4.0/../../../libmingw32.a(main.o):main.c:(.text+0x104): undefined reference to `WinMain@16'
Если мне память не изменяет, то так примерно ругается если не может найти точку входа в программу, функция main() у вас объявлена?
kerdster, да вот в том и дело что создавалась отдельная библиотека под linux-ом, которая создает libsamum.a, но я её создал этуже библиотеку уже под Windows, но похоже она не подхватываеться этими компонетами, которые я перевожу под Windows.
поэтому два вопроса:
1-ый:
вступление: описываю дерево папок одной большой программы:
общая папка с названием trunk, в ней лежат много папки с компонентами этой программы, так же в этой папке лежит папка lib и include, lib -> ( debug , release) и отдельно файлы .cpp .pro и т.д., в include лежат *.h, которые подгружаються в файлы .cpp, лежащие в lib. ну так вот вопрос как сделать так что бы libsamum.a создавался не в папке debug release, а просто в lib.
щас в файле .pro:
TEMPLATE = lib
CONFIG += staticlib
TARGET =
DEPENDPATH += .
INCLUDEPATH += .
INCLUDEPATH += ../include/
или надо создать новую конфигурацию сборки отличающиеся от дебаг и релиз? тогда как это сделать?
2-ой :
У меня создаеться бибилотека с именем libsamum.a а нужно просто что samum.a. Как это реализовать?
Цитата(TiiL @ 7.7.2011, 17:06)

mknod это чисто Unix функция, можеть быть есть таже функция, но под Window
mknod в данном случае создаёт named pipe (FIFO для какого-то обмена). в венде данной функции нет. надо смотреть, для чего создаётся pipe и кто обменивается данными. в венде это будет либо межпроцессное взаимодействие, либо какой-то поток данных внутри процесса.
Еще вопросики, как в файле *.pro задать условие: если Linux то "строчка читаеться", если нет то не читать.
и второй есть путь к библиотеке:
LIBS += E:\alexprojects\samum\trunk\lib\debug\libsamum.a
хотелось бы прописать его так чтобы на любой комп, на который я принесу эту проект, не изменяю пути видел библиотеку.
Заранее спасибо.
Iron Bug
13.7.2011, 11:45
Цитата(TiiL @ 13.7.2011, 12:26)

хотелось бы прописать его так чтобы на любой комп, на который я принесу эту проект, не изменяю пути видел библиотеку.
тут несколько путей:
1. ты складываешь библиотеку куда-то внутри своего проекта и прописываешь
относительный путь (что-то типа LIBS += ..\samum\trunk\lib\debug\libsamum.a)
2. ты объявляешь
переменную среды, вроде SAMUM_DIR, и юзаешь её через значение: LIBS +=
$(SAMUM_DIR)\lib\debug\libsamum.a
а экспортируешь её, например, из скрипта, в зависимости от системы.
а так, линюкс все библиотеки стандартно хранит в системно прописанных путях и ему не нужно указывать путь, если библиотека установлена стандартно. более того, чтобы потом она работала, тебе придётся либо её установить, либо при линковке указать, что нужно искать библиотеки в локальной папке: к линкеру добавлять строку
-R . (точка там нужна!), либо при старте указывать путь поиска библиотеки в
LD_LIBRARY_PATH.
Litkevich Yuriy
13.7.2011, 12:00
Цитата(TiiL @ 13.7.2011, 13:26)

как в файле *.pro задать условие: если Linux то "строчка читаеться"
тыц (в частности раздел "Значения области видимости платформы")
Litkevich Yuriy,
Iron Bug,
Спасибо, Мужики, реально помогаете!
ребята мне уже стыдно обращаться к вам, но ни как не могу найти функцию mknod для win...
Iron Bug
13.7.2011, 16:29
Цитата(TiiL @ 13.7.2011, 18:46)

ребята мне уже стыдно обращаться к вам, но ни как не могу найти функцию mknod для win...
я ж
пишу: нету такой функции в венде. нету потому что пайпы там по-другому организованы.
вот про пайпы вообще:
Именованные каналыпро пайпы для линюкса можно тут почитать, например:
http://anton.troshin.name/?p=985про пайпы для венды - тут:
Named pipes for WindowsP,S, вот тут человек даже некий С++ класс для удобства написал:
http://www.codeguru.com/cpp/i-n/network/na...ticle.php/c2475ибо под вендой это действительно выглядит очень монстрозно, а с классом вроде как полегче маленько
Litkevich Yuriy
14.7.2011, 18:46
Цитата(TiiL @ 13.7.2011, 16:21)

Спасибо, Мужики,
RazrFalcon, Кьют тут не причем, просто чтобы не плодить темы я задал вопрос в своей теме.
база данных для чтения открываеться.
Litkevich Yuriy
19.7.2011, 13:51
Цитата(TiiL @ 19.7.2011, 15:11)

Кьют тут не причем, просто чтобы не плодить темы я задал вопрос в своей теме.
на форуме не существует понятия "своя тема", форум - это не личный блог, а ресурс для коллективного решения проблем/обсуждения идей.
На любом нормальном форуме есть правило: "одна проблема - одна тема".
тему разделил
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.