Tôi muốn phát xung quanh với thư viện Allegro, nhưng dường như tôi không thể nhận dự án thử nghiệm của mình để liên kết đúng cách. Để chính xác, tôi nhận được lỗi cannot find -l<...>
, trong đó <...>
là tệp tôi đã chỉ định bằng cách sử dụng target_link_libraries
. (Xem bên dưới để biết chi tiết.)CMake không thể tìm thấy thư viện tĩnh sử dụng đường dẫn tệp tương đối
Để ghi lại, tôi không phải tất cả những kiến thức về quy trình xây dựng và cách tiếp cận thông thường của tôi là "nhấp vào nút và hy vọng một thực thi bật lên, nếu không, hãy phep thử va lôi sai." Tôi đã tìm thấy khá nhiều câu hỏi tương tự ở đây, nhưng có vẻ như vấn đề hoặc giải pháp khác với những gì tôi đang gặp phải. Tôi hy vọng cho một xác định "đây là những gì bạn đang làm sai, và đây là những gì để làm thay thế".
Điều đó nói rằng, đây là cấu trúc dự án của tôi:
/include
/lib
/src
main.cpp
CMakeLists.txt
Các bao gồm và thư mục lib tôi sao chép từ Allegro binary package, và lib là nơi tất cả các file .a cư trú.
Đây là những gì CMakeLists.txt tôi nói:
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
)
Và đây là những lỗi tôi nhận được:
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.>
tôi đã cố gắng xác định đường dẫn trong mọi cách có thể tưởng tượng — bao gồm kết hợp với việc sử dụng link_directories(lib)
— nhưng dường như không có bất kỳ ảnh hưởng nào.
Điều duy nhất mà đã làm công việc là xác định đường dẫn tuyệt đối (C:/Users/<...>/lib/liballegro-5.0.10-static-mt.a
), nhưng điều đó xảy ra với tôi rằng điều này là xa cách lý tưởng.
Tôi đang làm gì ở đây và cách được đề xuất để khắc phục sự cố là gì?
Tôi cảm thấy rằng với các đường dẫn tuyệt đối, dự án sẽ không còn được khép kín và thay vào đó dựa vào môi trường của nó. Tôi cho rằng 'CMAKE_CURRENT_SOURCE_DIR' là một cách để giải quyết vấn đề đó. Có thực sự không có cách nào để làm việc với con đường thực sự tương đối, mặc dù? Dường như với tôi như có nên. – vvye
Tôi đã mong đợi 'link_directories (lib)' để sửa lỗi này thành thật, nhưng việc sử dụng 'link_directories' không được khuyến khích - ngay cả trong [tài liệu riêng] (http://www.cmake.org/cmake/help) /v3.2/command/link_directories.html). Việc tìm các phiên bản 'CMAKE_SOURCE_DIR' và' CMAKE_CURRENT_SOURCE_DIR' rất phổ biến - tôi nghĩ đây là thực tế tốt. Nó giúp bạn tiết kiệm được việc phải kiểm tra các tài liệu cho các lệnh mà bạn không chắc chắn liệu chúng có xử lý các đường dẫn tương đối so với gốc nguồn hay gốc xây dựng hay không. – Fraser
Ít nhất bây giờ tôi hiểu sự miễn cưỡng của bạn nếu bạn nghĩ rằng bạn phải có đường dẫn tuyệt đối mã cứng từ máy của riêng bạn - mà thực sự nên tránh bằng mọi giá :) – Fraser