Autor Wątek: 'Resources files' na nie-windowsie?  (Przeczytany 1542 razy)

Offline proxy

  • Użytkownik

# Grudzień 20, 2009, 19:30:51
W kategoriach linuxowych leże i kwiczę, więc pytam się tutaj:

Moim celem jest skomponowanie programu, który będzie działał na Windowsach jak i na innych systemach. Dodatkowe pliki do programu chcę wkleić do tzw. exeka. W Windowsie zabawa kończyła się na .rc i bajerach typu FindResource(). A co w przypadku Linuxów, etc?

Czy takie coś jest w ogóle możliwe? Czy można wklejać pliki do pliku wykonywanego na innych systemach niż Windows? Oczywiście wykluczając emulację programu, czy używanie linuxowego 'wine'.

Jeśli szczęście mi dopisze i będzie taka możliwość, jak to wszystko obsługiwać?

Pozdrawiam
Proxy

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline MadBonsai

  • Użytkownik
    • Ifrit

# Grudzień 20, 2009, 20:05:21
Zależy od IDE. Jeśli skonfigurujesz je tak, by zasoby były pobierane z danego katalogu (stworzonego przez ciebie lub kreator projektu), nie powinno być problemu.
Oczywiści jest najprzyjemniejsze, jeśli na obydwu systemach korzystasz z tego samego IDE. Np. katalog projektu dostępny i z windy, i pingiwna: partycja FAT3, NTFS, ext3, ext2. Windows nie zobaczy i nie zapiszę poprawnie w ext4, nawet ze wsparciem programów.

Rozumiem, że kwestie rozbieżności w samych plikach wykonywalnych i Wine pomijamy, nie? :)

Offline proxy

  • Użytkownik

# Grudzień 20, 2009, 20:26:17
Hmm... Rozumiem.

Cytuj
Rozumiem, że kwestie rozbieżności w samych plikach wykonywalnych i Wine pomijamy, nie? Smiley
Tak, pomijamy.

A co jeśli chodzi o obsługę? Z czym to się je, zapominając o narzędziach winapi?

Offline vashpan

  • Użytkownik
    • Strona

# Grudzień 20, 2009, 21:08:59
Zależy od IDE. Jeśli skonfigurujesz je tak, by zasoby były pobierane z danego katalogu (stworzonego przez ciebie lub kreator projektu), nie powinno być problemu.
Oczywiści jest najprzyjemniejsze, jeśli na obydwu systemach korzystasz z tego samego IDE. Np. katalog projektu dostępny i z windy, i pingiwna: partycja FAT3, NTFS, ext3, ext2. Windows nie zobaczy i nie zapiszę poprawnie w ext4, nawet ze wsparciem programów.

Rozumiem, że kwestie rozbieżności w samych plikach wykonywalnych i Wine pomijamy, nie? :)

Wydaje mi sie ze koledze chodzi o co innego ;) Chce miec wszystkie dane jako zasob w programie, bez zadnych katalogow czy co. O IDE raczej sie nie rozchodzi...

Czy pod linuksem sie da ? Szczerze mowiac nie wiem. :) Nie slyszalem o czyms takim, ale moze warto sie przyjrzec narzedziu z mingw - windres - jest to kompilator windowsowych zasobow dla MinGW'owego GCC, powinien dzialac tez pod Linuksem i jak odpalam go z poziomu Windowsa widze ze oferuje support dla tkaich formatow plikow wynikowych:

Cytuj
windres: supported targets: pe-i386 pei-i386 elf32-i386 elf32-little elf32-big

PE - format plikow wykonywalnych pod Windowsem, ELF - (przewaznie) pod Linuksem i nie tylko.

Ale nawet jak udaloby ci sie podpiac wynik z tego windres do linkera, zlinkowac. To pozostaje kwestia jak sie dobrac do tych danych :) Byc moze zrodla Wine bylyby pomocne ? A byc moze ktos kiedys sie nudzil i o tym pomyslal. Musisz googlowac.



Offline MadBonsai

  • Użytkownik
    • Ifrit

# Grudzień 20, 2009, 22:55:15
Aaaa. Ja tam nie wiem jak w przypadku tak uważanych przeze mnie za toporne C\C++. Jeśli chodziłoby o Javę, to zwyczajnie ładujesz wszystkie zasoby do wykonywalnego JARa (w końcu to odmiana archiwum)  8)

Offline maciek_slon

  • Użytkownik

# Grudzień 20, 2009, 23:30:31
Qt też sobie jakoś radzi z ładowaniem zasobów do plików, działa dokładnie tak samo na Lin i Win.

Offline ropuch

  • Użytkownik

# Grudzień 20, 2009, 23:45:39
Pod linuksem mozna to zrobic na przyklad poprzez doklejenie wszystkich zasobow na koniec pliku wykonywalnego. Tam nie ma problemu z otworzeniem do odczytu (zapisu tez) aktualnie wykonywanej binarki. Jedyny problem, to ze trzeba obliczyc w jakich miejscach pliku znajduja sie odpowiednie zasoby.

Offline bies

  • Użytkownik

# Grudzień 21, 2009, 00:16:21
Ludzie, dlaczego tak kombinujecie. To jest Linux -- tu ma być prosto! Primo należy trzymać dane w $PREFIX/share/nazwa-programu. Ale jeśli z jakiegoś powodu chcecie trzymać w pliku wykonywanym to proszę bardzo. Tylko prosto!

Program bin2c:
#include <iostream>
#include <iterator>

using namespace std;

int main(int argc, char **argv) {
    if (argc != 2) {
        cerr << "Usage: cat binfile | " << argv[0] << " RESOURCE_NAME >cfile.c" << endl;
        return -1;
    }

    cout << "#include <stdlib.h>" << endl;
    cout << "const char " << argv[1] << "[] = {" << endl;
    istreambuf_iterator<char> input(cin.rdbuf());
    size_t size = 0;
    while (true) {
        cout << "0x" << hex << int(*input);
        ++size;
        ++input;
        if (input != istreambuf_iterator<char>())
            cout << ",";
        else
            break;
    }
    cout << "};" << endl;
    cout << "const size_t " << argv[1] << "_SIZE = " << dec << size << ";";
}

Użycie:
Cytat: lukasz@moria
# cat bin2c.cc|bin2c BIN2C_SOURCE >b2c_res.c
# gcc -o b2c_res.o -c b2c_res.c
# g++ -o b2c_show.o -c b2c_show.cc
# g++ -o b2c_show b2c_res.o b2c_show.o
# ./b2c_show
...

Źródło b2c_show.cc:
#include <iostream>
#include <algorithm>
#include <iterator>

using namespace std;

extern const size_t BIN2C_SOURCE_SIZE;
extern const char BIN2C_SOURCE[];

int main() {
    copy(BIN2C_SOURCE, BIN2C_SOURCE+BIN2C_SOURCE_SIZE, ostream_iterator<char>(cout));
    cout << endl;
}

Ropuch: do zapisu zdecydowanie jest problem:
Cytat: lukasz@moria
# ll /bin/ksh
212K -rwxr-xr-x 1 root root 209K 2008-06-02 09:17 /bin/ksh*
Nie wolno liczyć, że ma się prawa do zapisu do binarki -- to oczywista luka bezpieczeństwa.
« Ostatnia zmiana: Grudzień 21, 2009, 00:18:27 wysłana przez bies »

Offline ropuch

  • Użytkownik

# Grudzień 21, 2009, 00:25:27
Ropuch: do zapisu zdecydowanie jest problem:
Cytat: lukasz@moria
# ll /bin/ksh
212K -rwxr-xr-x 1 root root 209K 2008-06-02 09:17 /bin/ksh*
Nie wolno liczyć, że ma się prawa do zapisu do binarki -- to oczywista luka bezpieczeństwa.

Z prawem do odczytu jest tak samo. Moze sie zdarzyc, ze ma sie prawo jedynie do uruchomienia. Jednak jak ktos juz tak kombinuje z upychaniem danych do binarki, powinien sie liczyc ze pewne warunki musza byc spelnione.