CMake 无法使用相对文件路径找到静态库
CMake cannot find a static library using relative file paths
我想尝试一下 Allegro 库,但我似乎无法将我的测试项目正确地设置到 link。确切地说,我收到 cannot find -l<...>
错误,其中 <...>
是我使用 target_link_libraries
指定的文件。 (详情见下文。)
郑重声明,我对构建过程不是很了解,我通常的做法是 "click a button and hope an executable pops up, if not, resort to trial and error." 我在这里发现了很多类似的问题,但似乎问题或解决方案与我遇到的不同。我希望得到一个明确的 "here's what you're doing wrong, and here's what to do instead".
也就是说,这是我的项目结构:
/include
/lib
/src
main.cpp
CMakeLists.txt
我从 Allegro binary package 复制的 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)
的用法结合使用 - 但似乎没有任何效果。
所做的唯一的工作是指定绝对路径(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
。
我想尝试一下 Allegro 库,但我似乎无法将我的测试项目正确地设置到 link。确切地说,我收到 cannot find -l<...>
错误,其中 <...>
是我使用 target_link_libraries
指定的文件。 (详情见下文。)
郑重声明,我对构建过程不是很了解,我通常的做法是 "click a button and hope an executable pops up, if not, resort to trial and error." 我在这里发现了很多类似的问题,但似乎问题或解决方案与我遇到的不同。我希望得到一个明确的 "here's what you're doing wrong, and here's what to do instead".
也就是说,这是我的项目结构:
/include
/lib
/src
main.cpp
CMakeLists.txt
我从 Allegro binary package 复制的 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)
的用法结合使用 - 但似乎没有任何效果。
所做的唯一的工作是指定绝对路径(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
。