CMake不能使用相对文件路径找到静态库

CMake cannot find a static library using relative file paths

本文关键字:静态 路径 文件 不能 相对 CMake      更新时间:2023-10-16

我想玩周围的Allegro库,但我似乎不能得到我的测试项目链接正确。确切地说,我得到了cannot find -l<...>错误,其中<...>是我使用target_link_libraries指定的文件。(详情见下文)

郑重声明,我对构建过程并不了解,我通常的方法是"点击一个按钮,希望弹出一个可执行文件,如果没有,就尝试和错误。"我在这里发现了很多类似的问题,但似乎无论是问题还是解决方案都与我所经历的不同。我希望有一个明确的"这是你做错的地方,这是你应该做的"。

也就是说,这是我的项目结构:

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

我从Allegro二进制包中复制的include和lib目录,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.>

我已经尝试了所有可能的方法来指定路径—包括与link_directories(lib) &mdash的结合使用;但似乎没有任何效果。

唯一能工作的是指定绝对路径(C:/Users/<...>/lib/liballegro-5.0.10-static-mt.a),但我觉得这远非理想的方式。

我在这里犯了什么错误,建议用什么方法来修复它?

我推荐的方法是使用绝对路径。我不知道为什么你认为这远不是理想的;实现起来很简单:

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.
)

我以前做过类似的事情,我做的是这样的:

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

请注意,前面没有lib,后面没有.a