CMake связать библиотеку (.a/.so)

У меня есть следующая файловая структура проекта:

libs/
  └──FreeImage/
        ├── FreeImage.dll
        ├── FreeImage.h
        ├── FreeImage.lib
        ├── license-fi.txt
        ├── license-gplv2.txt
        └── license-gplv3.txt
main.cpp
CMakeLists.txt

My CMakeLists.txt:

cmake_minimum_required(VERSION 2.8.4)
project(untitled)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

set(FREEIMAGE_LIBRARY_AND_HEADER_DIRECTORY libs/FreeImage)
find_path(FREEIMAGE_LIBRARY_AND_HEADER_DIRECTORY FreeImage.h)
find_library(FREEIMAGE_LIBRARY_AND_HEADER_DIRECTORY freeimage)
include_directories(${FREEIMAGE_LIBRARY_AND_HEADER_DIRECTORY})

set(SOURCE_FILES main.cpp)
add_executable(main ${SOURCE_FILES})

target_link_libraries(main freeimage)

Я следовал этому, чтобы написать свой CMakeLists.txt, но он не т работать на меня.

Выход:

/home/username/main_ssd/soft/linux/portable/clion-140.569.17/bin/cmake/bin/cmake --build /home/username/.clion10/system/cmake/generated/70336599/70336599/Debug --target main -- -j 4
-- Configuring done
-- Generating done
-- Build files have been written to: /home/username/.clion10/system/cmake/generated/70336599/70336599/Debug
Scanning dependencies of target main
[100%] Building CXX object CMakeFiles/main.dir/main.cpp.o
Linking CXX executable main
/usr/bin/ld: cannot find -lfreeimage
collect2: error: ld returned 1 exit status
CMakeFiles/main.dir/build.make:85: recipe for target 'main' failed
make[3]: *** [main] Error 1
CMakeFiles/Makefile2:60: recipe for target 'CMakeFiles/main.dir/all' failed
make[2]: *** [CMakeFiles/main.dir/all] Error 2
CMakeFiles/Makefile2:72: recipe for target 'CMakeFiles/main.dir/rule' failed
make[1]: *** [CMakeFiles/main.dir/rule] Error 2
Makefile:160: recipe for target 'main' failed
make: *** [main] Error 2

person Pavel    schedule 05.12.2014    source источник
comment
В боковой заметке каталог пишется как каталог   -  person remram    schedule 07.12.2014
comment
Спасибо! Я исправил это в коде.   -  person Pavel    schedule 07.12.2014


Ответы (3)


set(FREEIMAGE_LIBRARY_AND_HEADER_DIRRECTORY libs/FreeImage)

Переменной FREEIMAGE_LIBRARY_AND_HEADER_DIRRECTORY присвоено значение libs/FreeImage

find_path(FREEIMAGE_LIBRARY_AND_HEADER_DIRRECTORY FreeImage.h)

Переменная FREEIMAGE_LIBRARY_AND_HEADER_DIRRECTORY установлена ​​в каталог, содержащий именованный файл FreeImage.h . Подсказки к командам отсутствуют из-за отсутствия необязательных аргументов ПУТИ или ПОДСКАЗКИ

find_library(FREEIMAGE_LIBRARY_AND_HEADER_DIRRECTORY freeimage) Переменная FREEIMAGE_LIBRARY_AND_HEADER_DIRRECTORY имеет значение полный путь к библиотеке. FreeImage (если найдено). Подсказки к командам отсутствуют из-за отсутствия необязательных аргументов ПУТИ или ПОДСКАЗКИ

include_directories(${FREEIMAGE_LIBRARY_AND_HEADER_DIRRECTORY})

Переменная FREEIMAGE_LIBRARY_AND_HEADER_DIRRECTORY содержит полный путь к библиотеке FreeImage (если она найдена).

target_link_libraries(main freeimage)

В CMakeLists.txt не существует цели с именем freeimage, поэтому интерпретируется, что вы хотите связать -lfreeimage

Вопрос: Почему вы пытаетесь использовать «dll» в Linux?

person Peter    schedule 05.12.2014
comment
Я думал, что это возможно. Теперь я нашел более новую версию этой библиотеки и нашел библиотеки .so и .a. - person Pavel; 05.12.2014

Я скачал новую версию библиотеки FreeImage (от здесь) и скомпилировал ее, следуя этим инструкциям:

Compiling FreeImagePlus
-----------------------
FreeImagePlus is a C++ wrapper for FreeImage. 
To compile FreeImage as a C++ library, follow these steps : 
1) Enter the FreeImage directory
2) Build the distribution : 
make -f Makefile.fip
make -f Makefile.fip install
3) Clean all files produced during the build process
make -f Makefile.fip clean

Итак, у меня есть следующая файловая структура библиотеки:

libs/FreeImage/
├── FreeImage.h
├── FreeImagePlus.h
├── libfreeimageplus-3.16.0.so
├── libfreeimageplus.a
├── license-fi.txt
├── license-gplv2.txt
└── license-gplv3.txt

Затем я изменил свой CMakeLists.txt следующим образом:

cmake_minimum_required(VERSION 2.8.4)
project(untitled)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

find_path(SIFTGPU_INCLUDE_DIR FreeImage.h)
find_library(SIFTGPU_LIBRARY libfreeimageplus)
include_directories(${SIFTGPU_INCLUDE_DIR})

add_executable(main ${SOURCE_FILES})

target_link_libraries(main freeimageplus)
person Pavel    schedule 05.12.2014

Питер указывает вам правильное направление:

target_link_libraries(main freeimage)

следует заменить на:

target_link_libraries(main ${freeimage})

где ${freeimage} — это переменная, содержащая значение пути к библиотеке, на которую вы хотите создать ссылку, полученную с помощью find_library.

Надеюсь, поможет.

person LaurentTrk    schedule 05.12.2014