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 denedimc:/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?
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
'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
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