Ребят, (ой, и девчат :)) помогите пожалуйста. Решил свою достаточно большую программулину написанную в виндах и естественно в визуал С++ портировать на линукс. Программу заранее писал максимально кроссплатформенную. К ней написано много всяких вспомогательных библиотек. Конечно уверен что еще возникнет не мало проблем с портацией, но первая проблема возникла с библиотеками. Допустим я имею искодник mylib.cpp. Как из него с помощью gcc или g++ сделать не объектный файл а либу? Допустим mylib.a? Либа должна быть статической. Извините еще раз за этот тупой вопрос, но в юниксах я пока еще детеныш. Как ни крутил ни ветрел этот gcc, так библиотеку произвести на свет и не смог. Да, и еще, как мне потом эту либу подключить к проекту?Заранее благодарен за все ответы.
статическая библиотека - это всего-лишь архив объектных файлов.
собирается командой:ar -cr mylib.a file1.o file2.o file3.o ...
*.cpp файлы компиляй с опцией -fpic
подключать статическую библиотеку как и обычный объектный файл.
>статическая библиотека - это всего-лишь архив объектных файлов.
>собирается командой:
>
>ar -cr mylib.a file1.o file2.o file3.o ...
>
>*.cpp файлы компиляй с опцией -fpic
>
>подключать статическую библиотеку как и обычный объектный файл.А вот за это спасибо, все коротко и ясно
Если у вас все либы в исходниках - то зачем вообще превращать их в либы? Пропишите в Makefile эти исходники и все пучком будет.
>Если у вас все либы в исходниках - то зачем вообще превращать
>их в либы?
А может одну либу разные проекты юзают...
>Если у вас все либы в исходниках - то зачем вообще превращать
>их в либы? Пропишите в Makefile эти исходники и все пучком
>будет.
На сколько я понимаю, объектный файл подключается к проекту целиком, а из либы берутся только те ф-ции и классы, которые используются в проекте. Этим они и отличаются (либы от объектников). Например, когда ты подключаешь какую нить стандартную библиотеку, из нее компилится только те классы (а может даже только методы) и ф-ции, которые ты вызываешь. (Ну, естественно, и те, которые они сами внутри себя вызывают). Вот только поэтому я и хочу делать все с помощью библиотек, потому что там у меня куча всяких ф-ций, которые в данном проекте не используются, ну а в других - может и понадобятся.Если я не прав, пожалуйста разубедите меня.
Статическая либа войдет в твой проект вся :)
Используй динамические библиотеки, если один код во многих проектах повторяется.Опережая встречный вопрос...
Динамическая библиотека собирается так:gcc -shared -fpic -o libmylib.so file1.o file2.o ...
Подключаешь к проекту как -lmylib
Сенькю вери мач всем. Все уже заработало в линух, причем достаточно быстро. Сам не ожидал. Нашел интересную деталь в различии компиляторов айкрософта (Visual C++ 6.0) и gcc (3.4.2). Может кто не знает. Если в цикле for в скобочках объявить любую переменную, то область ее видимости в gcc будет простираться до завершения цикла for, а в visual до следующей фигурной скобки. Например:gcc - правильно, visual c++ - ошибка
for (std::list<int>::iterator i(mylist.begin()); i != mylist.end(); ++i){
...
}for (std::list<int>::iterator i(mylist.begin()); i != mylist.end(); ++i){
...
}в визуале надо писать, например так:
for (std::list<int>::iterator i(mylist.begin()); i != mylist.end(); ++i){
...
}for (i = mylist.begin(); i != mylist.end(); ++i){
...
}или так
{for (std::list<int>::iterator i(mylist.begin()); i != mylist.end(); ++i){
...
}}{for (std::list<int>::iterator i(mylist.begin()); i != mylist.end(); ++i){
...
}}не слабый баг
>Нашел интересную деталь в различии компиляторов айкрософта (Visual
>C++ 6.0) и gcc (3.4.2). Может кто не знает. Если в
>цикле for в скобочках объявить любую переменную, то область ее видимости
>в gcc будет простираться до завершения цикла for, а в visual
>до следующей фигурной скобки.По стандарту C++ (ISO/IEC 14882) должно быть как в gcc. MSVC 6.0 делался вроде ещё до выхода этого стандарта (первый вариант - 1998 год), думаю дело в этом. Так что это не совсем ошибка.
Пример ваш не совсем понял, но в вижуале область видимости переменной, объявленной в заголовке цикла распространяется на блок, В КОТОРОМ находится этот цикл. То есть, как бы она объявлена непосредственно перед циклом (если по стандарту). Если память не изменяет.
а, понял пример - просто невнимательно посмотрел в первый раз...
это как раз подтверждает то, что я сказал
>Сенькю вери мач всем. Все уже заработало в линух, причем достаточно быстро.
>Сам не ожидал. Нашел интересную деталь в различии компиляторов айкрософта (Visual
>C++ 6.0) и gcc (3.4.2). Может кто не знает. Если в
>цикле for в скобочках объявить любую переменную, то область ее видимости
>в gcc будет простираться до завершения цикла for, а в visual
>до следующей фигурной скобки. Например:
>
>gcc - правильно, visual c++ - ошибкаМожно использовать ключ для VC++: /Zc:forScope ,- в этом случае поведение компилятора аналогично gcc (стандарту). В VC 2005 он включен по умолчанию.