2015-05-16 16 views
11

Allegro kütüphanesiyle oynamak isterdim, ama test projemin düzgün bir şekilde link vermesi mümkün görünmüyor. Tam olarak cannot find -l<...> hatalarını alıyorum, burada <...>, target_link_libraries kullanarak belirttiğim bir dosyadır. (Ayrıntılar için aşağıya bakın.)CMake, ilgili dosya yollarını kullanarak statik bir kütüphane bulamıyor

Kayıt için, yapı süreci hakkında her şeyden haberdar değilim, ve benim her zamanki yaklaşımım "bir düğmeyi tıklatırsanız ve bir yürütülebilir uygulamanın açıldığını umarsa" Deneme ve hata." Burada çok benzer sorular buldum, ama ya problemler ya da çözümler deneyimlediğimden farklı görünüyor. Kesin bir umudu umuyorum "işte yanlış yaptığınız şey, ve burada bunun yerine ne yapacağınız". sözü

, bu benim proje yapısı şöyledir:

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

dahildir ve ben Allegro binary package kopyalanmış lib dizinleri ve tüm .bir dosyaların bulunduğundan lib olduğunu.

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 
) 

Ve bu hatalar alıyorum şunlardır: Burada

benim CMakeLists.txt öyle diyor ben birleştirerek dahil her şekilde hayal — yolu belirterek denedim

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) — kullanımı ile herhangi bir etkisi yok gibi görünüyor.

eser mutlak yol (C:/Users/<...>/lib/liballegro-5.0.10-static-mt.a) belirterek, ancak bu kadar ideal bir şekilde gelen olduğuna aklıma yaptığını tek şey.

Burada nasıl bir hata yapıyorum ve bunu düzeltmenin en iyi yolu nedir?

cevap

9

'u önerdiğim yol, mutlak yolu kullanmak için'dur. Bunu neden ideal olarak görmediğinizden emin değilim; bunu başarmak için Önemsiz: Daha önce benzer şeyler yaptık

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

Mutlak yollarla, projenin artık kendi kendine yetmeyeceğini ve bunun yerine kendi çevresine güveneceğini hissediyorum. Bence CMAKE_CURRENT_SOURCE_DIR 'bunun bir yolu, bu yüzden bunu söylediğin için teşekkürler. Gerçi gerçekten göreceli yollarla çalışmak için gerçekten bir yolu yok mu? Olması gerektiği gibi görünüyor. – vvye

+1

'link_directories (lib)' nin dürüst olmak için bunu düzeltmesini beklerdim, fakat kendi linklerinde bile 'link_directories' kullanımı önerilmez (http://www.cmake.org/cmake/help /v3.2/command/link_directories.html). 'CMAKE_SOURCE_DIR' ve' CMAKE_CURRENT_SOURCE_DIR' örneklerini bulmak çok yaygın - bence bu gerçekten iyi bir uygulama. Kaynak köküne veya yapı köküne göre yolları ele alıp almadıklarından emin olmadığınız komutlar için dokümanları kontrol etmeniz gerektiğinden tasarruf etmenizi sağlar. – Fraser

+0

En azından şimdi, kendi makinenizden mutlak yolları sabit olarak kodlamanız gerektiğini düşündüyseniz, isteksizliğinizi anlıyorum - gerçekten de tüm maliyetlerden kaçınılmalıdır :) – Fraser

1

, yaptığım şu şekildedir: hayır lib lider ve .a sondaki olduğunu

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

ihbar.

+0

Çalışması gerektiğinden bu yana aşağı çekilmiyorum, ancak [link_directories'] için dokümanlar (http://www.cmake.org/cmake/help/v3.2/command/link_directories.html), kullanımının lehine 'target_link_libraries' için tam yolu geçme. – Fraser

+0

Bu benim için işe yaramadı. (Oldukça eminim zaten denedim şeyler arasındaydı.) – vvye

+0

@vvye Bu işe yarıyor. Ancak "Komut sadece çağrıldıktan sonra oluşturulan hedeflere uygulanacaktır." Yani 'link_directories'ı' add_executable' önce sorununuzu çözer. – duleshi

İlgili konular