URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 4896
[ Назад ]

Исходное сообщение
"компиляция библиотеки в gcc"

Отправлено Валерий , 01-Дек-05 18:40 
Ребят, (ой, и девчат :)) помогите пожалуйста. Решил свою достаточно большую программулину написанную в виндах и естественно в визуал С++ портировать на линукс. Программу заранее писал максимально кроссплатформенную. К ней написано много всяких вспомогательных библиотек. Конечно уверен что еще возникнет не мало проблем с портацией, но первая проблема возникла с библиотеками. Допустим я имею искодник mylib.cpp. Как из него с помощью gcc или g++ сделать не объектный файл а либу? Допустим mylib.a? Либа должна быть статической. Извините еще раз за этот тупой вопрос, но в юниксах я пока еще детеныш. Как ни крутил ни ветрел этот gcc, так библиотеку произвести на свет и не смог. Да, и еще, как мне потом эту либу подключить к проекту?

Заранее благодарен за все ответы.


Содержание

Сообщения в этом обсуждении
"компиляция библиотеки в gcc"
Отправлено Hordi , 01-Дек-05 21:35 
статическая библиотека - это всего-лишь архив объектных файлов.
собирается командой:

ar -cr mylib.a file1.o file2.o file3.o ...

*.cpp файлы компиляй с опцией -fpic

подключать статическую библиотеку как и обычный объектный файл.


"компиляция библиотеки в gcc"
Отправлено Валерий , 02-Дек-05 15:04 
>статическая библиотека - это всего-лишь архив объектных файлов.
>собирается командой:
>
>ar -cr mylib.a file1.o file2.o file3.o ...
>
>*.cpp файлы компиляй с опцией -fpic
>
>подключать статическую библиотеку как и обычный объектный файл.

А вот за это спасибо, все коротко и ясно


"компиляция библиотеки в gcc"
Отправлено dimus , 02-Дек-05 09:51 
Если у вас все либы в исходниках - то зачем вообще превращать их в либы? Пропишите в Makefile эти исходники и все пучком будет.

"компиляция библиотеки в gcc"
Отправлено Hordi , 02-Дек-05 10:17 
>Если у вас все либы в исходниках - то зачем вообще превращать
>их в либы?
А может одну либу разные проекты юзают...


"компиляция библиотеки в gcc"
Отправлено Валерий , 02-Дек-05 14:30 
>Если у вас все либы в исходниках - то зачем вообще превращать
>их в либы? Пропишите в Makefile эти исходники и все пучком
>будет.
На сколько я понимаю, объектный файл подключается к проекту целиком, а из либы берутся только те ф-ции и классы, которые используются в проекте. Этим они и отличаются (либы от объектников). Например, когда ты подключаешь какую нить стандартную библиотеку, из нее компилится только те классы (а может даже только методы) и ф-ции, которые ты вызываешь. (Ну, естественно, и те, которые они сами внутри себя вызывают). Вот только поэтому я и хочу делать все с помощью библиотек, потому что там у меня куча всяких ф-ций, которые в данном проекте не используются, ну а в других - может и понадобятся.

Если я не прав, пожалуйста разубедите меня.


"компиляция библиотеки в gcc"
Отправлено Hordi , 05-Дек-05 12:07 
Статическая либа войдет в твой проект вся :)
Используй динамические библиотеки, если один код во многих проектах повторяется.

Опережая встречный вопрос...
Динамическая библиотека собирается так:

gcc -shared -fpic -o libmylib.so file1.o file2.o ...

Подключаешь к проекту как -lmylib


"компиляция библиотеки в gcc"
Отправлено Валерий , 06-Дек-05 14:13 
Сенькю вери мач всем. Все уже заработало в линух, причем достаточно быстро. Сам не ожидал. Нашел интересную деталь в различии компиляторов айкрософта (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){
...
}}

не слабый баг


"компиляция библиотеки в gcc"
Отправлено jd , 06-Дек-05 21:53 
>Нашел интересную деталь в различии компиляторов айкрософта (Visual
>C++ 6.0) и gcc (3.4.2). Может кто не знает. Если в
>цикле for в скобочках объявить любую переменную, то область ее видимости
>в gcc будет простираться до завершения цикла for, а в visual
>до следующей фигурной скобки.

По стандарту C++ (ISO/IEC 14882) должно быть как в gcc. MSVC 6.0 делался вроде ещё до выхода этого стандарта (первый вариант - 1998 год), думаю дело в этом. Так что это не совсем ошибка.

Пример ваш не совсем понял, но в вижуале область видимости переменной, объявленной в заголовке цикла распространяется на блок, В КОТОРОМ находится этот цикл. То есть, как бы она объявлена непосредственно перед циклом (если по стандарту). Если память не изменяет.


"компиляция библиотеки в gcc"
Отправлено jd , 06-Дек-05 21:57 
а, понял пример - просто невнимательно посмотрел в первый раз...
это как раз подтверждает то, что я сказал

"компиляция библиотеки в gcc"
Отправлено chip , 13-Дек-05 00:35 
>Сенькю вери мач всем. Все уже заработало в линух, причем достаточно быстро.
>Сам не ожидал. Нашел интересную деталь в различии компиляторов айкрософта (Visual
>C++ 6.0) и gcc (3.4.2). Может кто не знает. Если в
>цикле for в скобочках объявить любую переменную, то область ее видимости
>в gcc будет простираться до завершения цикла for, а в visual
>до следующей фигурной скобки. Например:
>
>gcc - правильно, visual c++ - ошибка

Можно использовать ключ для VC++: /Zc:forScope ,- в этом случае поведение компилятора аналогично gcc (стандарту). В VC 2005 он включен по умолчанию.