Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

24.05.2013, 22:06. Просмотров 3414. Ответов 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 на эту тему нет ни книг, не вразумительных статей. Буду черезвычайно благодарен, за объяснения.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.05.2013, 22:06
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Правильная линковка библиотек (C++):

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

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

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

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

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

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

25
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. Простите что так далёк от компиляторов, ну я правда не знаю и найти не могу. Честное слово искал.
0
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
24.05.2013, 22:50 #3
Цитата Сообщение от No10 Посмотреть сообщение
Но файлы не обязательно помешать в компилятор
Не нужно их "помещать в компилятор", достаточно указать ему, где искать. Для g++ опция -I (-Ipath/to/library).
1
No10
30 / 28 / 2
Регистрация: 03.06.2010
Сообщений: 465
24.05.2013, 23:19  [ТС] #4
gray_fox, это понятно. А какие мы присоеденяем .h, .cpp, .dll или .a? Вроде по смыслу .a, но для чего они нужны?
И как сделать из этого makefile и как его потом передать компилятору или запустить? Как и где ссылаться на другие .h, source файлы?
0
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 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 $@
1
Jupiter
Каратель
Эксперт С++
6561 / 3982 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
24.05.2013, 23:47 #6
Цитата Сообщение от No10 Посмотреть сообщение
Нашёл статью на хабре "makefile для самых маленьких". написано доступно, на Windows не работает.
что конкретно не работает? для mingw вместо make - mingw32-make.exe
1
BAADF00D
Заблокирован
25.05.2013, 00:14 #7
библиотеки -- уже скомпилированный код.
Динамические: код можно вызвать из нее во время работы программы, при чем "одновременно" несколько программ могут использовать одну библиотеку.
Статические: код "инлайнится" в программу на стадии компиляции.
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.05.2013, 06:25 #8
No10, это почитай: "GCC._Полное_руководство_(Гриффитс)".
1
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. Тоже библиотеки, но для чего?
0
Миниатюры
Правильная линковка библиотек  
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
25.05.2013, 11:06 #10
Цитата Сообщение от No10 Посмотреть сообщение
И тут я столкнулся с новым файлом про который забыл спросить .lib. Тоже библиотеки, но для чего?
Это тоже статические библиотеки. Просто в Windows для них принято использовать расширение *.lib, а в *NIX-мире — *.a.
1
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
25.05.2013, 11:24 #11
Цитата Сообщение от No10 Посмотреть сообщение
nvMath.h находится в папке include, а nvModel в папке nvModel/include. Как? Как такое откомпилировать?
-Iinclude -InvModel/include, нет?
1
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? Нужно как то прицеплять?
0
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
25.05.2013, 12:02 #13
Цитата Сообщение от No10 Посмотреть сообщение
C:\Program Files (x86)\NVIDIA Corporation\NVIDIA OpenGL SDK 10\common\include
указывать его полностью или как?
Как удобней, можно относительный...
Цитата Сообщение от No10 Посмотреть сообщение
И куда деть файлы .lib?
Никуда, зачем они тебе?)
1
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
Опять не ищет. Не понимаю зависимость.
0
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
25.05.2013, 12:32 #15
No10, насколько я помню, нужно -I<dir> -I<dir> ..., у тебя получиться -I<dir><dir>...
1
25.05.2013, 12:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.05.2013, 12:32
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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