2015-05-16 23 views
11

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ì?

Trả lời

9

Cách tôi khuyên bạn nên để sử dụng đường dẫn tuyệt đối. Tôi không chắc tại sao bạn thấy điều này xa lý tưởng; nó tầm thường để đạt được:

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

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

+1

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

+0

Í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

1

tôi đã thực hiện điều tương tự trước đây, những gì tôi làm là như thế này:

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

thông báo rằng không có hàng đầu lib và trailing .a.

+0

Tôi không downvoting vì điều này sẽ làm việc, nhưng [docs for 'link_directories'] (http://www.cmake.org/cmake/help/v3.2/command/link_directories.html) không khuyến khích sử dụng nó chuyển đường dẫn đầy đủ tới 'target_link_libraries'. – Fraser

+0

Điều đó không hiệu quả đối với tôi. (Khá chắc chắn đó cũng là một trong những thứ tôi đã thử). – vvye

+0

@vvye Nó hoạt động. Nhưng "Lệnh sẽ chỉ áp dụng cho các mục tiêu được tạo sau khi nó được gọi." Vì vậy, đặt 'link_directories' trước khi' add_executable' giải quyết được vấn đề của bạn. – duleshi

Các vấn đề liên quan