Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.01.2019, 18:34   #1
Android1
Форумчанин
 
Регистрация: 26.08.2010
Сообщений: 121
По умолчанию Как статически подключить скачанную библиотеку XLNT в Cmake+VS2017

Здравствуйте,

Подскажите пожалуйста! по вопросу подключения статически сторонней библиотеки:

1)Скачал библиотеку xlnt для работы с екселем -https://github.com/tfussell/xlnt.
2)Скачал Cmake, установил, запустил под Windows:
-в запущенном Cmake строке "Where is the source" указываю путь к скаченной библиотеки XLNT с файлом CMakeLists.txt: C:/11/xlnt-master/xlnt-master/source
-потом указываю путь для "Where build the binaries" и нажимаю Generate. 3)Cmake создает проект для VS2017.
4)Загружаю этот проект в VS2017, и нажимаю "собрать" этот проект. VS2017 создает много файлов, среди который есть .lib файл, по идее файл статической библиотеки,но, оказывается - это только библиотека импорта для динамической библиотеки dll.
5)Создаю новый пустой проект в VS2017, там в свойствах проекта указал путь к .lib файлу и dll файлу, указываю #include xlnt.h, нажимаю компилироваться, но VS2017 выдает ошибку - "xlntd.dll поврежден..".

Два ВОПРОСА:
1)Что я сделал не так подключая динамическую dll библиотеку ?

2)Но самый главный вопрос, как подключить библиотеку Статически ?

Подскажите пожалуйста! С Cmake ни разу не работал.
Android1 вне форума Ответить с цитированием
Старый 11.01.2019, 19:55   #2
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

собрал для 2017 студии.

1. скачал проект с гитхаба.
2. скачал/установил cmake
3. подложил в корень проекта батник вот с таким содержимым:

build32.bat

Код:
@echo off
cls

@echo.
@echo.
@echo.

set "ePATH_CMAKE=C:\CMake\bin"

call :detectPathCmake
if errorlevel 1 (exit /b 1)

call :buildTarget
if errorlevel 1 (exit /b 1)
exit /b

rem =========================================================================
rem =========================================================================

:buildTarget
   mkdir %~dp0build32 >nul 2>nul
   cd %~dp0build32    >nul 2>nul

   if errorlevel 1 (
       @echo [ERROR] can not create directory: '%~dp0build32'
       set "PATH=%OLDPATH%"
       exit /b 1
   )

   set "OLDPATH=%PATH"
   set "PATH=%ePATH_CMAKE%;%PATH%"

   cmake -G"Visual Studio 15 2017" -D"CMAKE_BUILD_TYPE=Release" -D"STATIC=ON" "%~dp0"

   if errorlevel 1 (
       @echo [ERROR] cmake can not generate target-project: 'Release'
       set "PATH=%OLDPATH%"
       exit /b 1
   )

   cmake --build . --target install --config Release
   if errorlevel 1 (
       @echo [ERROR] cmake can not install target-result...
       set "PATH=%OLDPATH%"
       exit /b 1
   )

   set "PATH=%OLDPATH%"
exit /b

rem =========================================================================
rem =========================================================================

:detectPathCmake
    set "ePATH_CMAKE=%ePATH_CMAKE%; Program Files\CMake\bin; Program Files (x86)\CMake\bin"
    set "OLDPATH=%PATH"
    set "PATH=%ePATH_CMAKE%;%PATH%"
    where cmake.exe >nul 2>nul
    if errorlevel 1 (
        @echo [ERROR] cmake not found
        exit /b 1
    )
    set "PATH=%OLDPATH%"
exit /b

собралась статическая либка (dll не нужна)
если я правильно понял - со статическим рантаймом.

что бы собрать динамическую либку, нужно вместо:
Код:
   cmake -G"Visual Studio 15 2017" -D"CMAKE_BUILD_TYPE=Release" -D"STATIC=ON" "%~dp0"
использовать:
Код:
   cmake -G"Visual Studio 15 2017" -D"CMAKE_BUILD_TYPE=Release" "%~dp0"

что бы собирать 64 битную версию (x64)

нужно вместо строчки:
Код:
-G"Visual Studio 15 2017"
использовать строчку:
Код:
-G"Visual Studio 15 2017 Win64"

что бы использовать другие версии студии:
Код:
-G"Visual Studio 15 2017"
-G"Visual Studio 14 2015"
-G"Visual Studio 12 2013"
-G"Visual Studio 11 2012"
-G"Visual Studio 10 2010"
-G"Visual Studio 9 2008"
и соответственно, 64 битные версии:

Код:
-G"Visual Studio 15 2017 Win64"
-G"Visual Studio 14 2015 Win64"
-G"Visual Studio 12 2013 Win64"
-G"Visual Studio 11 2012 Win64"
-G"Visual Studio 10 2010 Win64"
-G"Visual Studio 9 2008 Win64"

что бы собрать статическую версию библиотеки,
с динамической версией рантайма - необходимо править скрипты сборки.
(это гемморойно, но решаемо)

в чем здесь особенность?

подключи lib к проекту.
пропиши пути к lib и к include
а dll положи рядышком с твоим exe
и у тебя всё будет оккай.

если же собрать библиотеку полностью как статическую,
тогда у тебя и рантайм тоже будет статический.
и твой итоговый exe будит жирный, как свинья.
а это уже не очень круто.

если тебе очень важно поиметь статическую линковку с динамическим рантаймом (как это бывает у всех воспитанных людей), тогда:


открой в любом текстовом редакторе файлик:
xlnt\cmake\ucm.cmake

найди там строчку:

Код:
    if("${ARG_STATIC}")
        foreach(flags ${flags_configs})
            if(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
                if(NOT ${flags} MATCHES "-static-libstdc\\+\\+")
                    set(${flags} "${${flags}} -static-libstdc++")
                endif()
                if(NOT ${flags} MATCHES "-static-libgcc")
                    set(${flags} "${${flags}} -static-libgcc")
                endif()
            elseif(MSVC)
                if(${flags} MATCHES "/MD")
                    string(REGEX REPLACE "/MD" "/MT" ${flags} "${${flags}}")
                endif()
            endif()
        endforeach()
и закоментируй строчки, что бы получилось вот так:
Код:
    if("${ARG_STATIC}")
        foreach(flags ${flags_configs})
            if(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
                if(NOT ${flags} MATCHES "-static-libstdc\\+\\+")
                    set(${flags} "${${flags}} -static-libstdc++")
                endif()
                if(NOT ${flags} MATCHES "-static-libgcc")
                    set(${flags} "${${flags}} -static-libgcc")
                endif()
#            elseif(MSVC)
#                if(${flags} MATCHES "/MD")
#                    string(REGEX REPLACE "/MD" "/MT" ${flags} "${${flags}}")
#                endif()
            endif()
        endforeach()

теоретически, это отключит "линковку статически с рантаймом"
но на практике я не проверял.


вот ты как проверишь - дай знать)))
_Bers вне форума Ответить с цитированием
Старый 11.01.2019, 20:36   #3
Android1
Форумчанин
 
Регистрация: 26.08.2010
Сообщений: 121
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
3. подложил в корень проекта батник вот с таким содержимым:
build32.bat
...
собралась статическая либка (dll не нужна)
Сделал, запустил,открылась пустая консоль на секунду и закрылась, никакой статической либки не собралось
Android1 вне форума Ответить с цитированием
Старый 11.01.2019, 20:48   #4
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Android1 Посмотреть сообщение
Сделал, запустил,открылась пустая консоль на секунду и закрылась, никакой статической либки не собралось
а ты вообще, как батники запускаешь?

батник нужно запускать из командной строки.

удобно запускать из под Far32
или из total commander

или можно просто зайти в пуск.
запустить cmd

в черно-белом окошке сделать:
Код:
cd путь_к_проекту
затем сделать:
Код:
build32.bat
главное, что б запуск батника был из консольки,
а не из проводника.


Можно конечно и из проводника тоже запускать.
Но если что-то пошло не так.
Например - он не нашел симейк,
тогда окошко быстро закроется.
и ты не успеешь увидеть в чем был косяк.


обрати внимание на строчку:
Код:
set "ePATH_CMAKE=C:\CMake\bin"
если ты установил cmake по нестандартному пути,
и не прописал пути к нему в переменной окружения PATH,
тогда он может не собрать просто потому, что не нашел cmake

в этом случае нужно в этой строчечке указать путь к твоему симейку.

Последний раз редактировалось _Bers; 11.01.2019 в 20:52.
_Bers вне форума Ответить с цитированием
Старый 11.01.2019, 20:51   #5
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Для сборки вообще обычно ж надо запускать из x86 Native Tools Command Prompt for VS 2017 и т.п. (искать в Пуск написав любую часть названия).
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 11.01.2019, 20:58   #6
Android1
Форумчанин
 
Регистрация: 26.08.2010
Сообщений: 121
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
а ты вообще, как батники запускаешь?
Просто в текстовик скопировал Ваш код и txt переименовал в bat. Так нельзя ?

Цитата:
Сообщение от _Bers Посмотреть сообщение
обрати внимание на строчку:
Код:
set "ePATH_CMAKE=C:\CMake\bin"
если ты установил cmake по нестандартному пути,
и не прописал пути к нему в переменной окружения PATH,
тогда он может не собрать просто потому, что не нашел cmake

в этом случае нужно в этой строчечке указать путь к твоему симейку.
А я думал пусть к Cmake вот этой строкой указывается:

Цитата:
set "ePATH_CMAKE=%ePATH_CMAKE%; Program Files\CMake\bin; Program Files (x86)\CMake\bin"
Изменил ePATH_CMAKE=C:\CMake\bin на рельный путь, где находится Cmake. Процесс запустился.

Последний раз редактировалось Android1; 11.01.2019 в 21:01.
Android1 вне форума Ответить с цитированием
Старый 11.01.2019, 21:02   #7
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от Android1 Посмотреть сообщение
Просто в текстовик скопировал Ваш код и txt переименовал в bat. Так нельзя ?
Вопрос же был про запуск, а не создание файла.
Так вы не увидите вывод, консоль пропадет.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 11.01.2019, 21:07   #8
Android1
Форумчанин
 
Регистрация: 26.08.2010
Сообщений: 121
По умолчанию

1)Создалось три .lib файла в папках:
-build32\intalled\lib\xlnt.lib
-build32\source\Release\xlnt.lib
-build32\source\thurd-party\libstudxml.lib

Нужный вот этот - build32\source\Release\xlnt.lib ?
А остальные два зачем ?

2)
Цитата:
важно поиметь статическую линковку с динамическим рантаймом
Это значит для работы нужен будет .dll файл ?

3)После того, как Cmake создал все эти файлы, нужно ли открывать файлы созданные Cmake`ом в VS:

-build32\source\xlnt.sln
-build32\xlnt_all.sln

Какой из них или сразу два ?

Последний раз редактировалось Android1; 11.01.2019 в 21:25.
Android1 вне форума Ответить с цитированием
Старый 11.01.2019, 23:03   #9
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Для сборки вообще обычно ж надо запускать из x86 Native Tools Command Prompt for VS 2017 и т.п. (искать в Пуск написав любую часть названия).
не нужно.
симейку нужно знать имя генератора.
всё остальное он возьмёт на себя.
_Bers вне форума Ответить с цитированием
Старый 11.01.2019, 23:04   #10
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,357
По умолчанию

Цитата:
Сообщение от Android1 Посмотреть сообщение
build32\source\Release\xlnt.lib
Скорее всего здесь файл был изначально собран.


Цитата:
Сообщение от Android1 Посмотреть сообщение
build32\intalled\lib\xlnt.lib
Похоже, сюда он был скопирован.


Цитата:
Сообщение от Android1 Посмотреть сообщение
build32\source\thurd-party\libstudxml.lib
Наверно сторонняя библиотека, нужная самой библиотеке XLNT
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как к WebStorm скачанную тему подключить? (на win 7). DanDiablo Софт 0 24.09.2016 17:56
Как подключить библиотеку в с++? hjacob Общие вопросы C/C++ 12 01.08.2012 16:10
Как подключить библиотеку??? Benera Общие вопросы Delphi 6 27.04.2012 13:12
Как подключить библиотеку. Dasharnb777 Общие вопросы .NET 4 30.09.2010 12:14