Как подключить dll к проекту codeblocks
Решение
Это библиотека шаблонов. Вы можете поместить его в любое место, пока оно находится в пути (доступно).
Просто включите правильные заголовки, и это должно работать. Не нужно ничего связывать, все в заголовках.
Другие решения
Добавьте одну строку кода в ваш исходный файл, где вы хотите использовать Eigen.
Поместите Eigen (извлеченный zip-файл) в каталог, в который вы положили существующий рабочий заголовочный файл.
Лично я понятия не имел, как установить eigen на блоки кода, но вот шаги, которые я сделал, и это сработало:
Я узнал шаги от Вот
Этот был хитрым для меня. Я использую Code :: Blocks Ver 17.12.
б) Извлек файл в папку моего проекта.
c) Изменено имя извлеченного файла с «eigen-eigen-b3f3d4950030» на «Eigen3» (вы можете выбрать любое имя).
Теперь вам нужно добавить библиотечные файлы для вашего проекта (чтобы компилятор знал, где искать необходимые библиотечные файлы).
д) В кодовых блоках нажмите Настройки -> Компилятор -> Поиск в каталогах -> Компилятор
Нажмите «Добавить» и добавьте папку Eigen3 (загруженная и извлеченная папка, которая была переименована в предыдущем шаге «c»).
После добавления нажмите на вкладку Linker (рядом с вкладкой «Compiler») и добавьте тот же путь к папке Eigen3.
f) Теперь нажмите на вкладку «Параметры сборки», которая находится рядом с вкладкой «Поиск в каталогах».
g) Установите флажок «Явно добавить каталог текущего компилируемого файла в каталог поиска компилятора». h) Установите флажок «Явно добавить каталог верхнего уровня проекта, чтобы скомпилировать каталог поиска».
Теперь ваша сборка должна работать, и компилятор знает, как искать библиотеки Eigen.
Любые проблемы, просто отправьте это здесь.
С наилучшими пожеланиями
В моем радиоастрономическом проекте я устанавливаю Eigen с помощью следующей команды:
sudo apt-get install libeigen3-dev
мой cmake автоматически находит собственный заголовок, который я использовал. это образец моего заголовка
От переводчика: данная статья является второй в цикле переводов официального руководства по библиотеке SFML. Прошлую статью можно найти тут. Данный цикл статей ставит своей целью предоставить людям, не знающим язык оригинала, возможность ознакомится с этой библиотекой. SFML — это простая и кроссплатформенная мультимедиа библиотека. SFML обеспечивает простой интерфейс для разработки игр и прочих мультимедийных приложений. Оригинальную статью можно найти тут. Начнем.
1. Приступая к работе
- Рисование 2D объектов
- Спрайты и текстуры
- Текст и шрифты
- Формы
- Проектирование ваших собственных объектов с помощью массивов вершин
- Позиция, вращение, масштаб: преобразование объектов
- Добавление специальных эффектов с шейдерами
- Контроль 2D камеры и вида
- Проигрывание звуков и музыки
- Запись аудио
- Пользовательские потоки аудио
- Спатиализация: звуки в 3D
Вступление
Эта статья — первая, которую вам следует прочитать, если вы используете среду разработки Code::Blocks с компилятором GCC (это стандартный компилятор для данной среды разработки). В ней будет рассказано, как настроить ваш проект.
Установка SFML
Для начала вы должны скачать SFML SDK со страницы загрузки.
Есть несколько вариантов GCC для Windows, которые несовместимы друг с другом (отличия в обработке исключений, в потоковой модели и т.д.). Убедитесь, что вы выбирите пакет, который соответствует той версии GCC, что вы используете. Если вы не уверены, проверьте, какой из файлов (libgcc_s_sjlj-1.dll или libgcc_s_dw2-1.dll) присутствуют в вашей директории MinGW/bin. Если MinGW установлен вместе с Code::Blocks, у вас наверняка SJLJ версия. Если ваша версия GCC не может работать с предварительно скомпилированной версией библиотеки SFML, вам придется собрать SFML самостоятельно. Это не сложно.
Далее вы должны распаковать архив с SFML в любую удобную для вас директорию. Копировать заголовочные файлы и библиотеки в вашу установку MinGW не рекомендуется. Лучше держать библиотеки в отдельном месте, особенно если вы намереваетесь использовать несколько версий одной библиотеки или несколько компиляторов.
Создание и конфигурирование проекта SFML
Первое, что вам необходимо сделать — это выбрать тип создаваемого проекта. Code::Blocks предлагает широкий выбор типов проектов, включая «SFML project». Не используйте его! Данный тип проекта довольно долго не обновлялся и, скорее всего, несовместим с последними версиями SFML. Вместо этого, создайте пустой проект. Если вы хотите избавиться от консоли, в свойства проекта перейдите в «Build targets» и в комбинированном списке выбирите «GUI application» вместо «Console application».
Теперь вам необходимо указать компилятору, где искать заголовочные файлы (файлы с расширением .hpp) и компоновщику, где искать библиотеки SFML (файлы с расширением .lib).
Добавьте в «Build options», во вкладку «Search directories» следующее:
- Путь до заголовочных файлов SFML (<путь-к-установке-SFML>/include) в Compiler search directories
- Путь до библиотек SFML (<путь-к-установке-SFML>/lib) в Linker search directories
Следующий шаг — компоновка вашего приложения с библиотеками SFML (файлы с расширением .a). SFML состоит из пяти модулей (system, window, graphics, network и audio) и библиотек для каждого из них. Библиотеки должны быть добавлены в «Link libraries» в список опций сборки вашего проекта, под вкладку «Linker settings». Добавить все библиотеки SFML, которые вам нужны, например «sfml-graphics», «sfml-window» и «sfml-system» (префикс «lib» и расширение ".a" должны быть опущены).
Важно указать библиотеки, соответствующие конфигурации: «sfml-xxx-d» для Debug и «sfml-xxx» для Release, иначе могут возникнуть ошибки.
При компановке библиотек SFML, убедитесь, что вы прокомпоновали библиотеки в правильном порядке, это очень важно для GCC. Правило заключается в том, что библиотеки, которые зависят от других библиотек, должны быть помещены первыми в списке. Любая библиотека SFML зависит от sfml-graphics, sfml-window и sfml-system. Это показано на снимке экрана выше.
Настройки, приведенные выше, позволят вам скомпоновать ваш проект с динамической версией SFML, для которой требуются DLL файлы. Если вы хотите напрямую интегрировать SFML в ваш исполняемый файл, а не использовать компоновку с динамической библиотекой, вы должны скомпоновать статическую версию библиотеки. Статические библиотеки SFML имеют суффикс "-s": «sfml-xxx-s-d» для конфигурации Debug и «sfml-xxx-s» для Release.
Так же вам необходимо определить макрос SFML_STATIC в опциях препроцессора вашего проекта.
Начиная с SFML 2.2 при статической компоновке вам так же необходимо скомпоновать все зависимости SFML. Это означает, что если, к примеру, вы скомпонуете sfml-window-s или sfml-window-s-d, вам так же придется скомпоновать opengl32, winmm и gdi32. Некоторые из этих библиотек, возможно, уже перечислены в разделе «Inherited values», но добавление их не должно вызвать каких либо проблем.
- sfml-window-s
- sfml-system-s
- opengl32
- freetype
- jpeg
- sfml-system-s
- opengl32
- winmm
- gdi32
- sfml-system-s
- openal32
- flac
- vorbisenc
- vorbisfile
- vorbis
- ogg
- sfml-system-s
- ws2_32
- winmm
Если вы немного запутались, не волнуйтесь, для начинающего совершенно нормально быть перегруженным всей этой информацией о статическом связывании.Если у вас что-то не получится с первого раза, вы можете попробовать еще раз имея в виду все сказанное выше. Если у вас все же возникнут трудности со статическим связыванием, вы можете попробовать поискать решение в разделе FAQ или на форуме.
Если вы не знаете чем отличаются динамические (так же называемые общими) и статические библиотеки и какой тип библиотек использовать, вы можете найти больше информации в интернете. На данную тему есть множество хороших статей/блогов/постов.
Ваш проект готов, давайте напишем немного кода что бы проверить, что все работает правильно. Поместите следующий код в файл main.cpp:
Теперь скомпилируйте проект, и, если вы скомпоновали вашу программу с динамической версией SFML, не забудьте скопировать файлы с расширением .DLL (они расположены в <путь-к-установке-SFML>/bin) в директорию, в которой расположен исполняемый файл вашей программы. Запустите программу, и, если все было сделано правильно, вы должны увидеть это:
Если вы используете модуль sfml-audio (независимо от того, статическую или динамическую его версию), вы так же должны скопировать внешнюю dll библиотеку OpenAL32.dll. Этот файл так же может быть найден в директории <путь-к-установке-SFML>/bin.
С точки зрения программиста - DLL представляет собой библиотеку функций (ресурсов), которыми может пользоваться любой процесс, загрузивший эту библиотеку. Сама загрузка отнимает время и увеличивает расход потребляемой приложением памяти; поэтому дробление одного приложения на множество DLL ничего хорошего не принесет. Другое дело - если какие-то функции используются несколькими приложениями. Тогда, поместив их в одну DLL, мы избавимся от дублирования кода и сократим общий объем приложений - и на диске, и в оперативной памяти. Можно выносить в DLL и редко используемые функции отдельного приложения; например, немногие пользователи текстового редактора используют в документах формулы и диаграммы - так зачем же соответствующим функциям впустую "отъедать" память?
Загрузившему DLL процессу доступны не все ее функции, а лишь явно предоставляемые самой DLL для "внешнего мира" - т.н. экспортируемые. Функции, предназначенные сугубо для "внутреннего" пользования, экспортировать бессмысленно (хотя и не запрещено). Чем больше функций экспортирует DLL - тем медленнее она загружается; поэтому к проектированию интерфейса (способа взаимодействия DLL с вызывающим кодом) следует отнестись повнимательнее. Хороший интерфейс интуитивно понятен программисту, немногословен и элегантен: как говорится, ни добавить, ни отнять. Строгих рекомендаций на этот счет дать невозможно - умение приходит с опытом.
Содержание
Создание DLL в CodeBlocks
Для создания DLL-проекта в среде разработки CodeBlocks при создании нового проекта необходимо выбрать пункт «Dynamic Link Library». Созданный проект будет содержать два файла main.cpp и main.h.
Для экспортирования функции из DLL - перед ее описанием следует указать ключевое слово __declspec(dllexport).
Точка входа DLL
Каждая динамическая библиотека имеет точку входа. Точка входа это функция с определённым именем, которая вызывается операционной системой в нескольких специальных случаях. По умолчанию имя этой функции DllMain.
Система при вызове функции передаёт следующие параметры:
- hinstDLL - ссылка на DLL. В действительности для 32-х разрядных библиотек этот параметр содержит базовый (начальный) адрес по которому загружена библиотека в виртуальном адресном пространстве процесса.
- fdwReason - содержит код события которое было причиной вызова функции.
- LpvReserved - зарезервирован и не используется.
Используя эту функцию DLL может перехватить четыре различных события коды которых указываются в параметре fdwReason.
DLL_PROCESS_ATTACH новый процесс загружает динамическую библиотеку автоматически или функцией LoadLibrary.
DLL_PROCESS_DETACH процесс который использовал динамическую библиотеку завершается или выгружает её функцией FreeLibrary.
DLL_THREAD_ATTACH в одном из процессов использующих DLL создан новый поток.
DLL_THREAD_DETACH в одном из процессов использующих DLL завершился поток.
Вызов функций из DLL
Существует два способа загрузки DLL: с явной и неявной компоновкой.
При неявной компоновке функции загружаемой DLL добавляются в секцию импорта вызывающего файла. При запуске такого файла загрузчик операционной системы анализирует секцию импорта и подключает все указанные библиотеки. Ввиду своей простоты этот способ пользуется большой популярностью; но неявной компоновке присущи определенные недостатки и ограничения:
- Все подключенные DLL загружаются всегда, даже если в течение всего сеанса работы программа ни разу не обратится ни к одной из них;
- Если хотя бы одна из требуемых DLL отсутствует (или DLL не экспортирует хотя бы одной требуемой функции) - загрузка исполняемого файла прерывается, даже если отсутствие этой DLL не критично для исполнения программы.
- Поиск DLL происходит в следующем порядке: в каталоге, содержащем вызывающий файл; в текущем каталоге процесса; в системном каталоге %Windows%System%; в основном каталоге %Windows%; в каталогах, указанных в переменной PATH. Задать другой путь поиска невозможно (вернее - возможно, но для этого потребуется вносить изменения в системный реестр, и эти изменения окажут влияние на все процессы, исполняющиеся в системе - что не есть хорошо).
Явная компоновка устраняет все эти недостатки - ценой некоторого усложнения кода. Программисту самому придется позаботиться о загрузке DLL и подключении экспортируемых функций (не забывая при этом о контроле над ошибками, иначе в один прекрасный момент дело кончится зависанием системы). Зато явная компоновка позволяет подгружать DLL по мере необходимости и дает программисту возможность самостоятельно обрабатывать ситуации с отсутствием DLL. Можно пойти и дальше - не задавать имя DLL в программе явно, а сканировать такой-то каталог на предмет наличия динамических библиотек и подключать все найденные к приложению. Именно так работает механизм поддержки plug-in’ов в популярном файл-менеджере FAR (да и не только в нем).
Таким образом, неявной компоновкой целесообразно пользоваться лишь для подключения загружаемых в каждом сеансе, жизненно необходимых для работы приложения динамических библиотек; во всех остальных случаях - предпочтительнее явная компоновка.
Загрузка DLL с неявной компоновкой
Чтобы вызвать функцию из DLL, ее необходимо объявить в вызывающем коде - либо как external (т.е. как обычную внешнюю функцию), либо предварить ключевым словом __declspec(dllimport). Первый способ более популярен, но второй все же предпочтительнее - в этом случае компилятор, поняв, что функция вызывается именно из DLL, сможет соответствующим образом оптимизировать код. Например:
Загрузка DLL с явной компоновкой
Явную загрузку динамических библиотек осуществляет функция
или ее расширенный аналог
Обе они экспортируются из KERNEL32.DLL, следовательно, каждое приложение требует неявной компоновки по крайней мере этой библиотеки. В случае успешной загрузки DLL возвращается линейный адрес библиотеки в памяти. Передав его функции
мы получим указатель на функцию lpProcName, экспортируемую данной DLL. При возникновении ошибки обе функции возвращают NULL. После завершения работы с динамической библиотекой ее следует освободить вызовом функции
Для пояснения приведем код примера с подробными комментариями:
Выгрузка динамических библиотек из памяти
Когда загруженная динамическая библиотека больше не нужна - ее можно освободить, вызвав функцию
и передав ей дескриптор библиотеки, ранее возвращенный функцией LoadLibrary. Обратите внимание - DLL можно именно освободить, но не выгрузить! Выгрузка DLL из памяти не гарантируется, даже если работу с ней завершили все ранее загрузившие ее процессы.
Задержка выгрузки предусмотрена специально - на тот случай, если эта же DLL через некоторое время вновь понадобится какому-то процессу. Такой трюк оптимизирует работу часто используемых динамических библиотек, но плохо подходит для редко используемых DLL, загружаемых лишь однажды на короткое время. Никаких документированных способов насильно выгрузить динамическую библиотеку из памяти нет; а те, что есть - работают с ядром на низком уровне и не могут похвастаться переносимостью. Поэтому здесь мы их рассматривать не будем. К тому же - тактика освобождения и выгрузки DLL по-разному реализована в каждой версии Windows: Microsoft, стремясь подобрать наилучшую стратегию, непрерывно изменяет этот алгоритм; а потому и отказывается его документировать. Нельзя не обратить внимания на одно очень важное обстоятельство: динамическая библиотека не владеет никакими ресурсами - ими владеет, независимо от способа компоновки, загрузивший ее процесс. Динамическая библиотека может открывать файлы, выделять память и т. д., но память не будет автоматически освобождена после вызова FreeLibrary, а файлы не окажутся сами собой закрыты - все это произойдет лишь после завершения процесса, но не раньше! Естественно, если программист сам не освободит все ненужные ресурсы вручную, с помощью функций CloseHandle, FreeMemory и подобных им.
Если функция FreeLibrary пропущена, DLL освобождается (но не факт, что выгружается!) только после завершения вызвавшего процесса. Могут возникнуть сомнения: раз FreeLibrary немедленно не выгружает динамическую библиотеку из памяти, так зачем она вообще нужна? Не лучше ли тогда все пустить на самотек - все равно ведь загруженные DLL будут гарантированно освобождены после завершения процесса? Что ж, доля правды тут есть, и автор сам порой так и поступает; но при недостатке памяти операционная система может беспрепятственно использовать место, занятое освобожденными динамическими библиотеками под что-то полезное - а если DLL еще не освобождены, их придется "скидывать" в файл подкачки, теряя драгоценное время. Поэтому лучше освобождайте DLL сразу же после их использования!
Я пытаюсь использовать libcurl для простого приложения, использующего CodeBlocks IDE. В IDE Codeblocks, после выбора параметров сборки ==> Настройки компоновщика ==> Библиотеки ссылок ==> «Добавить», браузер файлов позволяет мне выбирать только между * .a, * .so, * .lib и *. Дил файлы. Почему он не позволяет мне выбирать файлы * .dll? Я загрузил двоичные пакеты для Windows для libcurl, и все они предоставляют файлы .dll. Вот как это выглядит:
==== ==== UPDATE
Тем не менее, у меня все еще есть проблемы с возможностью компиляции моего источника
код.
Ниже мой исходный код:
- Ниже приведен снимок экрана моей рабочей директории CodeBlocks IDE:
- Ниже приведены снимки экрана с параметрами сборки для компоновщика / компилятора и библиотек компоновщика:
Ниже приведен последний журнал сборки:
Решение
DLL (динамическая библиотека ссылок) ищется и загружается вашей программой во время выполнения. к
сделать это автоматически, вы не связываете .dll сам (вы не можете). Вы связываете соответствие библиотека импорта, с расширением .lib ,
Библиотека импорта для libcurl.dll является libcurl.lib , Если вы скачали и распаковали cURL скажем, в C:\develop\curl-7.34.0-win32 , затем вы найдете библиотеку импорта в
C:\develop\curl-7.34.0-win32\lib\libcurl.lib , Вы должны добавить этот файл в библиотеки
для вашего проекта Code :: Blocks.
Обновление для дальнейших вопросов ОП
Ваша программа является примером simple.c с добавлением заголовка C ++, <iostream> ,
- Удалить свой libcurl проект и начать снова с чистой C проект (не C++ ).
- Добавьте только 1 исходный файл в проект C, пример simple.c или его копия. Не делай это .cpp файл или иным образом изменить его. Не добавляйте другие файлы в проект.
- В Варианты сборки ->Настройки компоновщика ->Библиотеки ссылок добавить относительный путь к libcurl.lib как и раньше.
- В Варианты сборки ->Поиск в каталогах ->составитель (не Linker) добавить относительный путь к CURL include каталог и ничего больше (не include\curl каталог).
- Не кладите ничего в Поиск по каталогам ->Linker.
- Постройте проект. Он компилирует и ссылки для меня.
Обновление № 2
Проблема сейчас в том, что вы пытаетесь связать 64-битный curl-7.34.0-win64\lib\libcurl.lib с 32-битным объектным кодом, сгенерированным вашим 32-битным набором инструментов, mingw32 , Вы не можете сделать это.
Замените вашу установку curl-7.34.0-win64 с curl-7.34.0-win32 с того же сайта. В вашем проекте замените your\path\to\curl-7.34.0-win64\lib\libcurl.lib с your\path\to\curl-7.34.0-win32\lib\libcurl.lib и попробуй еще раз. Пример скомпилирует и скомпонует.
Он также будет работать правильно при условии, что он найдет 32-разрядный libcurl.dll во время выполнения, а также 32-разрядные библиотеки DLL, которые динамически загружаются libcurl.dll в очереди. В целях примера просто скопируйте все библиотеки DLL из your\path\to\curl-7.34.0-win32\dlls в тот же каталог, что и .exe , Для регулярного развития cURL приложения, которые вы хотели бы cURL библиотеки, установленные в системе.
Так как вы решили скачать 64-битную cURL во-первых, вы можете захотеть собрать 64-битную
исполняемые файлы (хотя 32-битные исполняемые файлы будут работать на 64-битных хостах). Вы не можете сделать это
с вашим 32-битным набором инструментов, mingw32 , Вы можете установить 64-битный набор инструментов, например, Компилятор TDM-GCC MinGW ,
и настроить его как дополнительный набор инструментов в C :: B. В качестве альтернативы вы могли бы заменить свой
Установка C :: B с C :: B 13.12, предварительно настроенным для TDM-GCC, из Sourceforge
Читайте также: