2015-05-16 11 views
11

का उपयोग करके एक स्थिर लाइब्रेरी नहीं मिल रही है, मैं Allegro लाइब्रेरी के साथ खेलना चाहता हूं, लेकिन मुझे लगता है कि मेरी टेस्ट प्रोजेक्ट ठीक से लिंक नहीं हो रहा है। सटीक होने के लिए, मुझे cannot find -l<...> त्रुटियां मिल रही हैं, जहां <...> एक फ़ाइल है जिसे मैंने target_link_libraries का उपयोग करके निर्दिष्ट किया है। (विवरण के लिए नीचे देखें।)सीएमके को सापेक्ष फ़ाइल पथ

रिकॉर्ड के लिए, मैं सभी कि निर्माण प्रक्रिया के बारे में जानकार नहीं हूँ, और यह करने के लिए अपने सामान्य दृष्टिकोण एक बटन "पर क्लिक करें जाता है और आशा है कि एक निष्पादन पॉप अप होता है, अगर नहीं, करने के लिए सहारा परीक्षण त्रुटि विधि।" मुझे यहां बहुत सारे प्रश्न मिल गए हैं, लेकिन ऐसा लगता है कि या तो समस्याएं या समाधान जो मैं अनुभव कर रहा हूं उससे अलग हैं। मैं एक निश्चित "उम्मीद कर रहा हूं कि आप गलत क्या कर रहे हैं, और यहां इसके बजाय क्या करना है"।

कहा, यह मेरा परियोजना संरचना है:

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

को शामिल और lib निर्देशिका मैं Allegro binary package से नकल, और 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) निर्दिष्ट कर रहा है, लेकिन यह मेरे लिए होता है कि यह आदर्श तरीके से बहुत दूर है।

मैं यहां क्या गलती कर रहा हूं, और इसे ठीक करने का अनुशंसित तरीका क्या है?

उत्तर

9

जिस तरह से मैं की सिफारिश करता हूं, पूर्ण पथ का उपयोग करने के लिए है। मुझे यकीन नहीं है कि आप इसे आदर्श से दूर क्यों देखते हैं; इसे प्राप्त करने के तुच्छ है:

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

मुझे लगता है कि पूर्ण पथ के साथ परियोजना अब आत्मनिर्भर नहीं होगी और इसके बजाय इसके पर्यावरण पर भरोसा करेगी। मुझे लगता है कि 'CMAKE_CURRENT_SOURCE_DIR' उसके आस-पास एक तरीका है, इसलिए इसका उल्लेख करने के लिए धन्यवाद। वास्तव में वास्तव में सापेक्ष पथों के साथ काम करने का कोई तरीका नहीं है, यद्यपि? ऐसा लगता है जैसे होना चाहिए। – vvye

+1

मुझे ईमानदार होने के लिए 'link_directories (lib)' को ठीक करने की उम्मीद होगी, लेकिन 'link_directories' का उपयोग निराश हो गया है - यहां तक ​​कि अपने [अपने दस्तावेज़ों में) (http://www.cmake.org/cmake/help /v3.2/command/link_directories.html)। 'CMAKE_SOURCE_DIR' और' CMAKE_CURRENT_SOURCE_DIR' के उदाहरण ढूंढना बहुत आम है - मुझे लगता है कि यह वास्तव में अच्छा अभ्यास है। यह आपको उन आदेशों के लिए दस्तावेज़ों की जांच करने के लिए सहेजता है जहां आप सुनिश्चित नहीं हैं कि वे स्रोत रूट या बिल्ड रूट के सापेक्ष पथ का इलाज करते हैं। – Fraser

+0

कम से कम अब मैं आपकी अनिच्छा को समझता हूं यदि आपको लगता है कि आपको अपनी मशीन से पूर्ण पथ को हार्ड-कोड करना होगा - वास्तव में सभी लागतों से बचा जाना चाहिए :) – Fraser

1

मैं इसी तरह की बातों से पहले किया है, मैं क्या इस तरह है:

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

नोटिस नहीं अग्रणी lib और .a अनुगामी देखते हैं कि।

+0

मैं काम नहीं करना चाहिए क्योंकि मैं काम करना चाहिए, लेकिन [link_directories'] के लिए दस्तावेज़ [http://www.cmake.org/cmake/help/v3.2/command/link_directories.html) इसके उपयोग को इसके पक्ष में हतोत्साहित करते हैं 'target_link_libraries' के लिए पूर्ण पथ पारित करने के लिए। – Fraser

+0

यह मेरे लिए काम नहीं किया। (बहुत यकीन है कि उन चीजों में से एक था जो मैंने पहले ही कोशिश की थी।) – vvye

+0

@vvye यह काम करता है। लेकिन "आदेश केवल कॉल किए जाने के बाद बनाए गए लक्ष्यों पर लागू होगा।" तो 'add_executable' से पहले' link_directories' को अपनी समस्या हल करें। – duleshi

संबंधित मुद्दे