CMake не может найти статическую библиотеку, используя относительные пути к файлам

Я бы хотел поиграть с библиотекой Allegro, но, похоже, я не могу правильно связать свой тестовый проект. Точнее, я получаю ошибки cannot find -l<...>, где <...> - это файл, который я указал с помощью target_link_libraries. (Подробнее см. Ниже.)

Для записи я не так хорошо разбираюсь в процессе сборки, и мой обычный подход к ней - "нажмите кнопку и надеюсь, что исполняемый файл всплывает, если нет, прибегает к пробной версии и ошибке". Здесь я нашел довольно много подобных вопросов, но кажется, что проблемы или решения отличаются от того, что я испытываю. Я надеюсь на определенное "здесь, что вы делаете неправильно, и вот что делать вместо этого".

Тем не менее, это моя структура проекта:

/include
/lib
/src
    main.cpp
CMakeLists.txt

Каталоги include и lib, которые я скопировал из бинарного пакета Allegro, и lib, где находятся все файлы .a.

Вот что мой CMakeLists.txt говорит:

cmake_minimum_required(VERSION 3.2)
project(AllegroTest)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -static-libgcc -static-libstdc++ -fpermissive")
add_definitions( -DALLEGRO_STATICLINK )

file(GLOB SOURCES src/*.cpp)
set(SOURCE_FILES ${SOURCES})
add_executable(AllegroTest ${SOURCE_FILES})

include_directories(include)

target_link_libraries(AllegroTest
    liballegro-5.0.10-static-mt.a
    liballegro_acodec-5.0.10-static-mt.a
    liballegro_audio-5.0.10-static-mt.a
    libvorbisfile-1.3.2-static-mt.a
    libvorbis-1.3.2-static-mt.a
    liballegro_color-5.0.10-static-mt.a
    liballegro_dialog-5.0.10-static-mt.a
    liballegro_font-5.0.10-static-mt.a
    liballegro_image-5.0.10-static-mt.a
    liballegro_memfile-5.0.10-static-mt.a
    liballegro_physfs-5.0.10-static-mt.a
    liballegro_primitives-5.0.10-static-mt.a
    liballegro_ttf-5.0.10-static-mt.a
    libdumb-0.9.3-static-mt.a
    libFLAC-1.2.1-static-mt.a
    libfreetype-2.4.8-static-mt.a
    libogg-1.2.1-static-mt.a
    libzlib-1.2.5-static-mt.a
    libopenal-1.14-static-mt.a
)

target_link_libraries(AllegroTest
    libgdiplus.a
    libuuid.a
    libkernel32.a
    libwinmm.a
    libpsapi.a
    libopengl32.a
    libglu32.a
    libuser32.a
    libcomdlg32.a
    libgdi32.a
    libshell32.a
    libole32.a
    libadvapi32.a
    libws2_32.a
    libshlwapi.a
)

И это ошибки, которые я получаю:

c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: cannot find -lallegro-5.0.10-static-mt
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: cannot find -lallegro_acodec-5.0.10-static-mt
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: cannot find -lallegro_audio-5.0.10-static-mt
<etc.>

Я пробовал указать путь во всех отношениях imaginable — включая объединение его с использованием link_directories(lib) — но ничего не имеет никакого эффекта.

Единственное, что работало, это указать абсолютный путь (C:/Users/<...>/lib/liballegro-5.0.10-static-mt.a), но мне кажется, что это далеко не идеальный путь.

Какую ошибку я делаю здесь, и какой рекомендуемый способ ее исправить?

Ответ 1

Я бы рекомендовал использовать абсолютный путь. Я не уверен, почему вы видите это как можно дальше от идеала; это тривиально:

target_link_libraries(AllegroTest
    ${CMAKE_CURRENT_SOURCE_DIR}/lib/liballegro-5.0.10-static-mt.a
    ${CMAKE_CURRENT_SOURCE_DIR}/lib/liballegro_acodec-5.0.10-static-mt.a
    etc.
)

Ответ 2

Я делал подобные вещи раньше, что я делаю так:

link_directories(lib)
target_link_libraries(my_target
    allegro-5.0.10-static-mt
    allegro_acodec-5.0.10-static-mt
    ...
)

обратите внимание, что нет ведущих lib и конечных .a.