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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.73
No10
 Аватар для No10
30 / 28 / 2
Регистрация: 03.06.2010
Сообщений: 465
24.05.2013, 22:06     Правильная линковка библиотек #1
Долго искал в интернете, ничего толкового не нашёл, решил спросить тут. После создания приложения компилятор прицепляет файл статически, либо они должны быть в папке с проектом. Так вот зачем нужны .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     Правильная линковка библиотек
Посмотрите здесь:

Линковка проекта. C++
Линковка библиотек в VS C++2010 C++
C++ Линковка библиотек DirectX SDK
Статическая линковка C++
C++ Линковка плюсового кода
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
No10
 Аватар для 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!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
24.05.2013, 22:50     Правильная линковка библиотек #3
Цитата Сообщение от No10 Посмотреть сообщение
Но файлы не обязательно помешать в компилятор
Не нужно их "помещать в компилятор", достаточно указать ему, где искать. Для g++ опция -I (-Ipath/to/library).
No10
 Аватар для 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!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 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
Каратель
Эксперт C++
6542 / 3962 / 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
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.05.2013, 06:25     Правильная линковка библиотек #8
No10, это почитай: "GCC._Полное_руководство_(Гриффитс)".
No10
 Аватар для 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
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
25.05.2013, 11:06     Правильная линковка библиотек #10
Цитата Сообщение от No10 Посмотреть сообщение
И тут я столкнулся с новым файлом про который забыл спросить .lib. Тоже библиотеки, но для чего?
Это тоже статические библиотеки. Просто в Windows для них принято использовать расширение *.lib, а в *NIX-мире — *.a.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
25.05.2013, 11:24     Правильная линковка библиотек #11
Цитата Сообщение от No10 Посмотреть сообщение
nvMath.h находится в папке include, а nvModel в папке nvModel/include. Как? Как такое откомпилировать?
-Iinclude -InvModel/include, нет?
No10
 Аватар для 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!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
25.05.2013, 12:02     Правильная линковка библиотек #13
Цитата Сообщение от No10 Посмотреть сообщение
C:\Program Files (x86)\NVIDIA Corporation\NVIDIA OpenGL SDK 10\common\include
указывать его полностью или как?
Как удобней, можно относительный...
Цитата Сообщение от No10 Посмотреть сообщение
И куда деть файлы .lib?
Никуда, зачем они тебе?)
No10
 Аватар для 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
Опять не ищет. Не понимаю зависимость.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
25.05.2013, 12:32     Правильная линковка библиотек #15
No10, насколько я помню, нужно -I<dir> -I<dir> ..., у тебя получиться -I<dir><dir>...
No10
 Аватар для No10
30 / 28 / 2
Регистрация: 03.06.2010
Сообщений: 465
25.05.2013, 12:35  [ТС]     Правильная линковка библиотек #16
gray_fox, спасибо. 100% работает
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
25.05.2013, 12:38     Правильная линковка библиотек #17
No10, с обычным прямым слэшем разве не работоет оно?
No10
 Аватар для No10
30 / 28 / 2
Регистрация: 03.06.2010
Сообщений: 465
25.05.2013, 12:58  [ТС]     Правильная линковка библиотек #18
gray_fox, не пробовал, взял в кавычки из за пробелов, а слеши шас попробую.
Блин он все линкует правильно, но вдруг в библиотеках NVIDIA нашёл кучу ошибок. И мне кажется что это из-за Source файлов, их похоже тоже нужно линковать.

Добавлено через 5 минут
вот например ошибка.
C++
1
C:\..\include\GL\glew.h:84: ошибка: #error gl.h included before glew.h
Вот текст вот строки
C++
1
2
#if defined(__gl_h_) || defined(__GL_H__)
#error gl.h included before glew.h
С чего он её взял. Может нужно .lib или .a какие нибудь присоединить?

Добавлено через 1 минуту
да, вот так тоже работает
C++
1
-I"C:/Program Files (x86)/NVIDIA Corporation/NVIDIA OpenGL SDK 10/common/include"
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
25.05.2013, 13:01     Правильная линковка библиотек #19
No10, он вам говорит что порядок включений неверный
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.05.2013, 13:01     Правильная линковка библиотек
Еще ссылки по теме:

C++ Статическая линковка boost
C++ Статическая линковка
C++ Статическая линковка MinGW

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

Или воспользуйтесь поиском по форуму:
No10
 Аватар для No10
30 / 28 / 2
Регистрация: 03.06.2010
Сообщений: 465
25.05.2013, 13:01  [ТС]     Правильная линковка библиотек #20
выше подключил
C++
1
#include <GL/gl.h>
Прилинковал нормально, ошибки те же.
Yandex
Объявления
25.05.2013, 13:01     Правильная линковка библиотек
Ответ Создать тему
Опции темы

Текущее время: 21:02. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru