С Новым годом! Форум программистов, компьютерный форум, киберфорум
C/C++: IDE, инструментарий
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/21: Рейтинг темы: голосов - 21, средняя оценка - 4.62
Модератор
 Аватар для Curry
5153 / 3465 / 536
Регистрация: 01.06.2013
Сообщений: 7,529
Записей в блоге: 9

CMake. Как подключить стороннюю dll для использования в создаваемом exe

06.10.2022, 02:21. Показов 5468. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем!
Решил попробовать сделать проект с использованием lua.
Собирал lua из исходников, там сборка с использованием make, всё собралось, лог сборки прилагаю
Кликните здесь для просмотра всего текста
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
Подпапка или файл C:\prog\lua\lua-5.4.4 уже существует.
mingw32-make[1]: Entering directory 'C:/prog/lua/lua-5.4.4/src'
mingw32-make "LUA_A=lua54.dll" "LUA_T=lua.exe" \
"AR=gcc -std=gnu99 -shared -o" "RANLIB=strip --strip-unneeded" \
"SYSCFLAGS=-DLUA_BUILD_AS_DLL" "SYSLIBS=" "SYSLDFLAGS=-s" lua.exe
mingw32-make[2]: Entering directory 'C:/prog/lua/lua-5.4.4/src'
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL    -c -o lua.o lua.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL    -c -o lapi.o lapi.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL   -c lcode.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL    -c -o lctype.o lctype.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL    -c -o ldebug.o ldebug.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL    -c -o ldo.o ldo.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL    -c -o ldump.o ldump.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL    -c -o lfunc.o lfunc.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL    -c -o lgc.o lgc.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL   -c llex.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL    -c -o lmem.o lmem.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL    -c -o lobject.o lobject.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL    -c -o lopcodes.o lopcodes.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL   -c lparser.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL    -c -o lstate.o lstate.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL    -c -o lstring.o lstring.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL    -c -o ltable.o ltable.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL    -c -o ltm.o ltm.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL    -c -o lundump.o lundump.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL    -c -o lvm.o lvm.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL    -c -o lzio.o lzio.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL    -c -o lauxlib.o lauxlib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL    -c -o lbaselib.o lbaselib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL    -c -o lcorolib.o lcorolib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL    -c -o ldblib.o ldblib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL    -c -o liolib.o liolib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL    -c -o lmathlib.o lmathlib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL    -c -o loadlib.o loadlib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL    -c -o loslib.o loslib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL    -c -o lstrlib.o lstrlib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL    -c -o ltablib.o ltablib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL    -c -o lutf8lib.o lutf8lib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL    -c -o linit.o linit.c
gcc -std=gnu99 -shared -o lua54.dll lapi.o lcode.o lctype.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o lmem.o lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o ltm.o lundump.o lvm.o lzio.o lauxlib.o lbaselib.o lcorolib.o ldblib.o liolib.o lmathlib.o loadlib.o loslib.o lstrlib.o ltablib.o lutf8lib.o linit.o
strip --strip-unneeded lua54.dll
gcc -std=gnu99 -o lua.exe -s  lua.o lua54.dll -lm
mingw32-make[2]: Leaving directory 'C:/prog/lua/lua-5.4.4/src'
mingw32-make "LUAC_T=luac.exe" luac.exe
mingw32-make[2]: Entering directory 'C:/prog/lua/lua-5.4.4/src'
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3     -c -o luac.o luac.c
ar rcu liblua.a lapi.o lcode.o lctype.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o lmem.o lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o ltm.o lundump.o lvm.o lzio.o lauxlib.o lbaselib.o lcorolib.o ldblib.o liolib.o lmathlib.o loadlib.o loslib.o lstrlib.o ltablib.o lutf8lib.o linit.o
ranlib liblua.a
gcc -std=gnu99 -o luac.exe   luac.o liblua.a -lm
mingw32-make[2]: Leaving directory 'C:/prog/lua/lua-5.4.4/src'
mingw32-make[1]: Leaving directory 'C:/prog/lua/lua-5.4.4/src'
 
**** COMPILATION TERMINATED ****
 
**** BUILDING BINARY DISTRIBUTION ****
 
Подпапка или файл C:\prog\lua\5.4.4 уже существует.
Подпапка или файл C:\prog\lua\5.4.4\doc уже существует.
Подпапка или файл C:\prog\lua\5.4.4\bin уже существует.
Подпапка или файл C:\prog\lua\5.4.4\include уже существует.
C:\prog\lua\lua-5.4.4\doc\contents.html
C:\prog\lua\lua-5.4.4\doc\index.css
C:\prog\lua\lua-5.4.4\doc\logo.gif
C:\prog\lua\lua-5.4.4\doc\lua.1
C:\prog\lua\lua-5.4.4\doc\lua.css
C:\prog\lua\lua-5.4.4\doc\luac.1
C:\prog\lua\lua-5.4.4\doc\manual.css
C:\prog\lua\lua-5.4.4\doc\manual.html
C:\prog\lua\lua-5.4.4\doc\osi-certified-72x60.png
C:\prog\lua\lua-5.4.4\doc\readme.html
Скопировано файлов:        10.
C:\prog\lua\lua-5.4.4\src\lua.exe
C:\prog\lua\lua-5.4.4\src\luac.exe
Скопировано файлов:         2.
C:\prog\lua\lua-5.4.4\src\lua54.dll
Скопировано файлов:         1.
Скопировано файлов:         1.
Скопировано файлов:         1.
Скопировано файлов:         1.
Скопировано файлов:         1.
Скопировано файлов:         1.
 
**** BINARY DISTRIBUTION BUILT ****


Сделал проект для использования lua.
В корне CMakeLists.txt, в подкаталоге src/main.cpp

Проблема в том, что при установке Lua не генерируются .lib файлы, только .exe и .dll.
Можно бы указать компилятору в командной строке lua54.dll, как это сделано при сборке lua, ранее, в файле выше, есть строка
gcc -std=gnu99 -o lua.exe -s lua.o lua54.dll -lm
Но как это же сделать через CMake ?
lua54.dll скопировал в созданный ранее подкаталог build в проекте
Вначале пробовал так
Code
1
2
3
4
5
6
7
cmake_minimum_required(VERSION 3.0.0)
project(LuaExample VERSION 0.1.0)
 
set(LUA_PATH C:/prog/lua/5.4.4 )
include_directories("${LUA_PATH}/include")
TARGET_LINK_LIBRARIES(LuaExample build/lua54.dll)
add_executable(LuaExample src/main.cpp build/lua54.dll)
Ругается:
Code
1
2
3
[cmake] CMake Error at CMakeLists.txt:12 (TARGET_LINK_LIBRARIES):
[cmake]   Cannot specify link libraries for target "LuaExample" which is not built by
[cmake]   this project.
Перемещал lua54.dll и указывал разные пути к ней, всё тоже.
пробовал
Code
1
2
find_library(LUA_LIB NAMES lua54.dll    PATHS ${LUA_PATH}/bin  ) # место lua54.dll после сборки lua
message("LUA_LIB=${LUA_LIB}")
Результат
Code
1
LUA_LIB=LUA_LIB-NOTFOUND
link_directories("build") перед add_executable тоже не помогает. Застрял.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.10.2022, 02:21
Ответы с готовыми решениями:

Перевести exe в dll в cmake
Доброго времечки. Ребята помогите перевести проект в dll с запуском по точке входа. В в VC gui всё понятно в cmake не могу понять как, ...

Как подключить DLL к RunDLL32.exe в один клик?
У меня есть DLL-библиотека, которую я хотел бы подключить к RunDll32.exe, но не через командную строку, как обычно, а при помощи...

Как при компилировании на .Net'овском компиляторе (csc.exe) подключить COM-dll?
Может быть немножко не в тему, но всеже чтобы не создавать новую тему хочу спросить. Как при компилировании на .Net'овском компиляторе...

3
Модератор
Эксперт Java
 Аватар для alecss131
2848 / 1356 / 404
Регистрация: 11.08.2017
Сообщений: 4,329
Записей в блоге: 2
06.10.2022, 10:18
TARGET_LINK_LIBRARIES и add_executable не принимают dll, первому надо библиотеки lib/a, а второму только исходные файлы
lib файлы при сборке создаются, а вообще есть cmake обертка для сборки lua, тогда можно будет подключать через find_package
1
Модератор
 Аватар для Curry
5153 / 3465 / 536
Регистрация: 01.06.2013
Сообщений: 7,529
Записей в блоге: 9
06.10.2022, 10:25  [ТС]
Решил проблему c импортированием dll
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cmake_minimum_required(VERSION 3.0.0)
project(LuaExample VERSION 0.1.0)
 
set(LUA_PATH C:/prog/lua/5.4.4 )
 
include_directories(${LUA_PATH}/include)
 
add_library(lua54 SHARED IMPORTED)
set_property(TARGET lua54 PROPERTY
             IMPORTED_LOCATION ${LUA_PATH}/bin/lua54.dll)
set_property(TARGET lua54 PROPERTY
             IMPORTED_IMPLIB ${LUA_PATH}/bin/lua54.dll)
 
add_executable(LuaExample src/main.cpp )
target_link_libraries(LuaExample PRIVATE lua54)
Правда, мне не удалось использовать target_include_directories для указания пути к заголовочным файлам, мне кажется так было бы правильно. Вместо этого использовал include_directories.

Добавлено через 1 минуту
Цитата Сообщение от alecss131 Посмотреть сообщение
есть cmake обертка для сборки lua
Не подскажите ли где её найти?
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
07.10.2022, 22:00
Цитата Сообщение от Curry Посмотреть сообщение
Не подскажите ли где её найти?
Можно воспользоваться пакетными менеджерами.

У нас для сборки зависимостей используется vcpkg(ИМХО, conan более гибкий, но и более сложный в использовнии)
Для интеграции используется скрипт cmake
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#
# vcpkg integration
#
 
# get vcpkg root from env
if(DEFINED ENV{VCPKG_ROOT} AND NOT DEFINED CMAKE_TOOLCHAIN_FILE)
  set(CMAKE_TOOLCHAIN_FILE "$ENV{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake"
      CACHE STRING "")
endif()
 
# select target
if(DEFINED ENV{VCPKG_DEFAULT_TRIPLET} AND NOT DEFINED VCPKG_TARGET_TRIPLET)
  set(VCPKG_TARGET_TRIPLET "$ENV{VCPKG_DEFAULT_TRIPLET}" CACHE STRING "")
endif()
Добавлено через 6 минут
Далее пишется vcpkg.json с описанием зависимостей, который кладется в корневой каталог проекта.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.10.2022, 22:00
Помогаю со студенческими работами здесь

Как подключить стороннюю динамическую библиотеку?
как подключить стороннюю динамическую библиотеку(написана на с++) как нюансы?

Как подключить к проекту стороннюю программу?
Допустим я пишу программку на С++, и мне надо чтобы она взаимодействовала с другой программой (допустим cmd) Как это реализовать?

Как подключить стороннюю библиотеку (*.so) к проекту
Есть вопрос про подключение сторонних библиотек к проекту. У меня есть библиотека aaa.so, header файл bbb.h, и код, который использует...

Как использовать стороннюю библиотеку DLL?
Как стороннюю библиотеку DLL в Visual Studio C++???

Как импортировать стороннюю DLL в программу?
Здравствуйте! Интересуюсь как импортировать стороннюю DLL в программу так, что бы и на других ПК программа работала?


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru