Как написать CMakeLists.txt для использования скомпилированной библиотеки FreeImage и файла заголовка - PullRequest
0 голосов
/ 02 апреля 2019

Структура папок:

Project/
├── main.cpp
└── deps/
    └── FreeImage/
        ├── FreeImage.lib
        ├── FreeImage.dll
        ├── FreeImage.h
        ├── FreeImagePlus.lib
        ├── FreeImagePlus.dll
        └── FreeImagePlus.h

код:

#include <FreeImagePlus.h>

int main(void)
{
    fipImage i;
    return 0;
}

А теперь вопрос:

Как написать файл CMakeLists.txt, чтобы можно было скомпилировать все вышеперечисленное в Windows?

Моя попытка в качестве ответа ниже

Ответы [ 2 ]

1 голос
/ 02 апреля 2019

Вы должны использовать различные шаги здесь.Надлежащая цель - иметь все необходимое для использования FreeImage в файле FindFreeImage.cmake.Затем вы можете установить FreeImage.cmake следующим образом:

FIND_PATH(FreeImage_INCLUDE_DIR FreeImage.h HINTS ${FreeImage_ROOT})

FIND_LIBRARY(FreeImage_LIBRARY NAMES FreeImage HINTS ${FreeImage_ROOT})

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(FreeImage DEFAULT_MSG FreeImage_INCLUDE_DIR FreeImage_LIBRARY)

Конечно, вы должны добавить еще, чтобы при связывании с FreeImage вы получили набор путей включения, процедуру установки ... Но это было быбыть для другого вопроса.

0 голосов
/ 02 апреля 2019

Одно решение CMakeLists.txt с дополнительными советами

cmake_minimum_required(VERSION 3.8)

set(NAME cmakecopytest)

project(${NAME})

# The place to put built libraries
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG "${CMAKE_BINARY_DIR}/bin/windows-64/debug")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG "${CMAKE_BINARY_DIR}/bin/windows-64/debug")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_BINARY_DIR}/bin/windows-64/debug")

# Copying pre-compiled dll libraries next to the built libraries for them to be found in runtime without extra effort
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/deps/FreeImage/FreeImagePlus.dll" "${CMAKE_BINARY_DIR}/bin/windows-64/debug/FreeImagePlus.dll" COPYONLY)    
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/deps/FreeImage/FreeImage.dll" "${CMAKE_BINARY_DIR}/bin/windows-64/debug/FreeImage.dll" COPYONLY)

add_executable(${NAME}_exe main.cpp)

target_include_directories(${NAME}_exe PUBLIC ./ include/ deps/FreeImage)

target_link_libraries(${NAME}_exe PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/deps/FreeImage/FreeImage.lib" PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/deps/FreeImage/FreeImagePlus.lib")
# target_link_libraries(${NAME}_exe PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/deps/FreeImage/FreeImage" PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/deps/FreeImage/FreeImagePlus") # ERROR LNK1104: cannot open file '..\deps\FreeImage\FreeImage.obj'

Дополнительные советы:

  • CMAKE_BINARY_DIR содержит место, где вы создали решение (например, D: / Work/ Project / build)
  • Установка выходных каталогов и последующее копирование предварительно скомпилированных библиотек в то же место - это простой способ запустить ваш код без каких-либо дополнительных настроек в MSVS

    math(EXPR platform_bits "${CMAKE_SIZEOF_VOID_P} * 8")
    set(platform_dir bin/${CMAKE_SYSTEM_NAME}-${platform_bits})
    foreach(config DEBUG RELEASE RELWITHDEBINFO MINSIZEREL)
        foreach(var
                CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${config}
                CMAKE_LIBRARY_OUTPUT_DIRECTORY_${config}
                CMAKE_RUNTIME_OUTPUT_DIRECTORY_${config}
                )
            set(${var} "${CMAKE_BINARY_DIR}/${platform_dir}/${config}")
            string(TOLOWER "${${var}}" ${var})
            configure_file(${CMAKE_CURRENT_SOURCE_DIR}/deps/FreeImage/FreeImagePlus.dll ${var}/FreeImagePlus.dll COPYONLY)
            configure_file(${CMAKE_CURRENT_SOURCE_DIR}/deps/FreeImage/FreeImage.dll ${var}/FreeImage.dll COPYONLY)            
        endforeach()
    endforeach()
    
  • И этот цикл делает это для вас для всех требуемых конфигураций

Однако мне не нравится указывать '.lib'in target_link_libraries(...FreeImage.lib...)

У кого-то еще есть решение, позволяющее сказать target_link_libraries(${NAME}_exe PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/deps/FreeImage/FreeImage" PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/deps/FreeImage/FreeImagePlus"), избегая при этом ошибки связывания LNK1104: cannot open file '..\deps\FreeImage\FreeImage.obj'?

...