Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.73
No10
30 / 28 / 2
Регистрация: 03.06.2010
Сообщений: 465
#1

Правильная линковка библиотек - C++

24.05.2013, 22:06. Просмотров 3056. Ответов 25
Метки нет (Все метки)

Долго искал в интернете, ничего толкового не нашёл, решил спросить тут. После создания приложения компилятор прицепляет файл статически, либо они должны быть в папке с проектом. Так вот зачем нужны .dll библиотеки? Как работают в IDE и для чего файлы с расширением .a
Часто скачав библиотеку вижу такую картину:
Правильная линковка библиотек
Все понятно, в include - файлы заголовков, в src - Source, lib - непонятные файлы .a
Зайдя в компилятор мы видим такое:
Правильная линковка библиотек
Некоторые папки сходятся, а некоторые нет. Куда девать папку src?
Но файлы не обязательно помешать в компилятор, но если мы хотим их прицепить по типу
C++
1
2
3
4
5
6
7
#include <nvModel/nvModel.h>
//или вообще так
#include <nvModel>
//ну или так
#include <NVIDIA/nvModel.h>
//а никак не так
#include "C:\Program Files (x86)\NVIDIA Corporation\NVIDIA OpenGL SDK 10\common\nvModel\include\nvModel.h"
Нашёл статью на хабре "makefile для самых маленьких". написано доступно, на Windows не работает.
Что бы понять как действую IDE, нужно выполнить работу за них
  • Как правильно откомпилировать файл имея только блокнот и компилятор?
  • Как правильно прилинковать все библиотеки которых нет?
  • Как для Windows написать makefile?
  • Компилировать допустим через g++ через консоль просто, но как выполнить все выше перечисленные вопросы?
Не поскупитесь на ответы, для Windows на эту тему нет ни книг, не вразумительных статей. Буду черезвычайно благодарен, за объяснения.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.05.2013, 22:06     Правильная линковка библиотек
Посмотрите здесь:

Линковка библиотек в VS C++2010 - C++
Где то в параметрах проекта можно производить линковку библиотек к проекту. Кто нибудь знает где это искать., пролазил все настройки не...

Линковка библиотек DirectX SDK - C++
Добрый день, знатоки. У меня проблема с линковкой, поиск юзал, но советы из других тем не помогли. В общем, установил я Microsoft DirectX...

Статическая линковка библиотек в Code::Blocks - C++
Люди добрые, подскажите пожалуйста как выполнить статическую линковку библиотек в Code::Blocks (16.01).

Статическая линковка - C++
Появилась необходимость прилинковать статическую библиотеку (GLFW) к проекту на C++. Я подключил заголовки, а вот саму библиотеку...

Линковка проекта. - C++
Уважаемые профессионалы, ткните меня носом в ошибку. Есть некоторая программа с множеством функций и файлов. ...

Статическая линковка - C++
Добрый вечер. Прочитал что бы екзешка запускалась на любом компьютере нужно сделать статическую линковку. То есть прикрепить к екзешнику...

Статическая линковка MinGW - C++
Как задать статическую линковку для MinGW в среде Qt Creator? Прописал в pro- файле:, но не помогло.

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
No10
30 / 28 / 2
Регистрация: 03.06.2010
Сообщений: 465
24.05.2013, 22:10  [ТС]     Правильная линковка библиотек #2
Самое противное внутренние файлы библиотек могут ссылаться не на длинный путь, а на короткий
файл nvModel.h:
C++
1
#include <nvMath.h>
Сам файл nvModel.h в папке C:\Program Files (x86)\NVIDIA Corporation\NVIDIA OpenGL SDK 10\common\nvModel\include
А файл nvMath.h в C:\Program Files (x86)\NVIDIA Corporation\NVIDIA OpenGL SDK 10\common\include
P.S. Простите что так далёк от компиляторов, ну я правда не знаю и найти не могу. Честное слово искал.
gray_fox
What a waste!
1449 / 1178 / 61
Регистрация: 21.04.2012
Сообщений: 2,466
Завершенные тесты: 3
24.05.2013, 22:50     Правильная линковка библиотек #3
Цитата Сообщение от No10 Посмотреть сообщение
Но файлы не обязательно помешать в компилятор
Не нужно их "помещать в компилятор", достаточно указать ему, где искать. Для g++ опция -I (-Ipath/to/library).
No10
30 / 28 / 2
Регистрация: 03.06.2010
Сообщений: 465
24.05.2013, 23:19  [ТС]     Правильная линковка библиотек #4
gray_fox, это понятно. А какие мы присоеденяем .h, .cpp, .dll или .a? Вроде по смыслу .a, но для чего они нужны?
И как сделать из этого makefile и как его потом передать компилятору или запустить? Как и где ссылаться на другие .h, source файлы?
gray_fox
What a waste!
1449 / 1178 / 61
Регистрация: 21.04.2012
Сообщений: 2,466
Завершенные тесты: 3
24.05.2013, 23:42     Правильная линковка библиотек #5
Цитата Сообщение от No10 Посмотреть сообщение
Вроде по смыслу .a, но для чего они нужны?
Это статическая библиотека, по сути архив с объектными файлами. В g++, чтобы скомпонавать с библиотекой есть опция -l (например, для файла с именем libname.a пишем -lname). Где искать - опция -L.
Про динамические библиотеки я сам не особо знаю)

Добавлено через 12 минут
Цитата Сообщение от No10 Посмотреть сообщение
И как сделать из этого makefile и как его потом передать компилятору или запустить?
Ну я не знаток make, но обычно есть две цели: на компиляцию и компановку.
В первой будет что-нибудь вроде
Код
%.o: %.cpp
   g++ -c $(CXXFLAGS) -Ipath/to/directories -o $@
Во второй
Код
$(PROGRAM): $(OBJECTS)
   g++ $(OBJECTS) $(LDFLAGS) -o $@
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
24.05.2013, 23:47     Правильная линковка библиотек #6
Цитата Сообщение от No10 Посмотреть сообщение
Нашёл статью на хабре "makefile для самых маленьких". написано доступно, на Windows не работает.
что конкретно не работает? для mingw вместо make - mingw32-make.exe
BAADF00D
Заблокирован
25.05.2013, 00:14     Правильная линковка библиотек #7
библиотеки -- уже скомпилированный код.
Динамические: код можно вызвать из нее во время работы программы, при чем "одновременно" несколько программ могут использовать одну библиотеку.
Статические: код "инлайнится" в программу на стадии компиляции.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.05.2013, 06:25     Правильная линковка библиотек #8
No10, это почитай: "GCC._Полное_руководство_(Гриффитс)".
No10
30 / 28 / 2
Регистрация: 03.06.2010
Сообщений: 465
25.05.2013, 10:52  [ТС]     Правильная линковка библиотек #9
Цитата Сообщение от Jupiter Посмотреть сообщение
что конкретно не работает? для mingw вместо make - mingw32-make.exe
Спасибо замечательно получилось все. mingw32-make даже в path занесена и все замечательно работает.


Цитата Сообщение от alsav22 Посмотреть сообщение
No10, это почитай: "GCC._Полное_руководство_(Гриффитс)".
Уже скачал спасибо. И книгу Дракона скачал, тоже супер.

Я примерно понял как происходит прилинковка.
В прогремме допустим мы вводим:
C++
1
2
3
4
//подключаем все файлы из папки iostream
#include <iostream> 
//сначала ишем файлы в текушей папке
#include "myclass.h"
при использовании #include <>, компилятор ищет файл в папке компилятора или в переменной path у Windows?
Допустим, есть библиотека с таким вот расположением:
Правильная линковка библиотек
Допустим, в файле nvModel есть такой способ подключения библиотеки:
C++
1
#include <nvMath.h>
nvMath.h находится в папке include, а nvModel в папке nvModel/include. Как? Как такое откомпилировать?
Прописывать в path?
И тут я столкнулся с новым файлом про который забыл спросить .lib. Тоже библиотеки, но для чего?
Миниатюры
Правильная линковка библиотек  
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
25.05.2013, 11:06     Правильная линковка библиотек #10
Цитата Сообщение от No10 Посмотреть сообщение
И тут я столкнулся с новым файлом про который забыл спросить .lib. Тоже библиотеки, но для чего?
Это тоже статические библиотеки. Просто в Windows для них принято использовать расширение *.lib, а в *NIX-мире — *.a.
gray_fox
What a waste!
1449 / 1178 / 61
Регистрация: 21.04.2012
Сообщений: 2,466
Завершенные тесты: 3
25.05.2013, 11:24     Правильная линковка библиотек #11
Цитата Сообщение от No10 Посмотреть сообщение
nvMath.h находится в папке include, а nvModel в папке nvModel/include. Как? Как такое откомпилировать?
-Iinclude -InvModel/include, нет?
No10
30 / 28 / 2
Регистрация: 03.06.2010
Сообщений: 465
25.05.2013, 11:41  [ТС]     Правильная линковка библиотек #12
gray_fox, да ты прав.
Уже лучше вроеде линкует. А если до папки nvMath.h длинный длинный путь:
C:\Program Files (x86)\NVIDIA Corporation\NVIDIA OpenGL SDK 10\common\include
указывать его полностью или как?
И куда деть файлы .lib? Нужно как то прицеплять?
gray_fox
What a waste!
1449 / 1178 / 61
Регистрация: 21.04.2012
Сообщений: 2,466
Завершенные тесты: 3
25.05.2013, 12:02     Правильная линковка библиотек #13
Цитата Сообщение от No10 Посмотреть сообщение
C:\Program Files (x86)\NVIDIA Corporation\NVIDIA OpenGL SDK 10\common\include
указывать его полностью или как?
Как удобней, можно относительный...
Цитата Сообщение от No10 Посмотреть сообщение
И куда деть файлы .lib?
Никуда, зачем они тебе?)
No10
30 / 28 / 2
Регистрация: 03.06.2010
Сообщений: 465
25.05.2013, 12:28  [ТС]     Правильная линковка библиотек #14
gray_fox, спасибо)

Добавлено через 11 минут
Вот примерно мой makefile, но опять же проблема
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
CC = g++
EXE = nvTest
 
DIR1 = "C:\Program Files (x86)\NVIDIA Corporation\NVIDIA OpenGL SDK 10\common\nvModel\include"
DIR2 = "C:\Program Files (x86)\NVIDIA Corporation\NVIDIA OpenGL SDK 10\common\include"
DIR3 = "C:\Program Files (x86)\NVIDIA Corporation\NVIDIA OpenGL SDK 10\common\GLEW\include"
 
INCLUDE = -I
 
INCLUDE += $(DIR1)
INCLUDE += $(DIR2)
INCLUDE += $(DIR3)
all:
    $(CC) main.cpp -o $(EXE) $(INCLUDE)
В main.cpp пишем:
C++
1
#include <nvModel.h>
Все отлично nvModel.h работает, но компилятор говорит что в файле nvModel.h, no such directory GL/glew.h
Да в файле nvModel.h есть такое включение:
C++
1
#include <GL/glew.h>
хм. Очень странно, так как я подключил эту библиотеку, вот
C++
1
2
DIR3 = "C:\Program Files (x86)\NVIDIA Corporation\NVIDIA OpenGL SDK 10\common\GLEW\include"
INCLUDE += $(DIR3)
...common\GLEW\include\GL\...Ну и там нужные файлы(в том числе glew.h)
Если я подключаю ...\common\nvModel\include не первым, то в файле main.cpp ошибка
no such file directory nvModel.h
Опять не ищет. Не понимаю зависимость.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.05.2013, 12:32     Правильная линковка библиотек
Еще ссылки по теме:

Статическая линковка boost - C++
Hi all! Захотелось побаловаться бустом, и столкнулся с проблемой, что в пакете boost-libs отсутствуют *.а файлы. Сначала я хотел...

Линковка плюсового кода - C++
Компилирую статическую библиотеку c++ для последующего ее включения в с-проект. Делаю так: set COMPILER=...\arm-elf-g++.exe set...

Линковка, реализация в заголовочных файлах - C++
Ситуация следующая. Представим себет хедер, который содержит некоторый функционал и должен использоваться в нескольких проектах. Причем ...

Компиляция, линковка, статические и динамические библиотеки - C++
Доброго вам времени суток. Обращаюсь к вам со списком близких по теме вопросов. Если вам не сложно, хотя бы напишите URL или книгу, где об...

Линковка, статические, динамические библиотеки - матчасть - C++
Парился сегодня целый день, компиля cUrl c MinGW с поддержкой https - т.е. с OpenSSL и zlib. Долго мучался, ив процессе понял, что имею...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
gray_fox
What a waste!
1449 / 1178 / 61
Регистрация: 21.04.2012
Сообщений: 2,466
Завершенные тесты: 3
25.05.2013, 12:32     Правильная линковка библиотек #15
No10, насколько я помню, нужно -I<dir> -I<dir> ..., у тебя получиться -I<dir><dir>...
Yandex
Объявления
25.05.2013, 12:32     Правильная линковка библиотек
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru