2012-06-27 12 views
7

के साथ बिल्डिंग लाइब्रेरी मैं आपको सभी को परेशान करने के लिए क्षमा चाहता हूं, लेकिन मेरे पास सेमेक के साथ थोड़ा संकलन समस्या है।सेमीकेक

मेरे पास एक CMakeLists.txt फ़ाइल है जिसका उपयोग मैं परीक्षण निष्पादन योग्य और साझा लाइब्रेरी बनाने के लिए कर रहा हूं। दोनों की एक और पुस्तकालय (एसएफएमएल) पर निर्भरता है।

मैं मिनीजीडब्ल्यू के साथ खिड़की पर सेमेक का उपयोग कर रहा हूं।

मुझे पता है कि मैं जिस lib का निर्माण कर रहा हूं उसका नाम एसएफएमएल के साथ भ्रमित है, लेकिन यह एक एसएफएमएल रैपर होने वाला है, इसलिए, मुझे एक बेहतर नाम नहीं मिला!

यहाँ CMakeLists.txt

cmake_minimum_required(VERSION 2.6) 
project(projectName) 

set(EXECUTABLE_NAME testSFML) 
set(LIBRARY_NAME SFMLwindow) 

set(EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/bin/) 

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include/
${CMAKE_CURRENT_SOURCE_DIR}/../../include 
) 

link_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../lib/) 

file(
    GLOB_RECURSE 
    SRC_FILES 
    src/* 
) 

file(
    GLOB_RECURSE 
    INCLUDE_FILES 
    include/* 
) 

add_executable(
${EXECUTABLE_NAME} 
main.cpp 
${SRC_FILES} 
${INCLUDE_FILES} 
) 

target_link_libraries(
    ${EXECUTABLE_NAME} 
    sfml-main 
    sfml-system 
    sfml-window 
) 


add_library(
${LIBRARY_NAME} 
SHARED 
${SRC_FILES} 
) 

और क्या मैं टर्मिनल में मिलती है:

"C:\MinGW\bin\mingw32-make.exe" 
-- Configuring done 
-- Generating done 
-- Build files have been written to: C:/Users/iksemel/docs/WorkBench/programming/projets/TestSFML/cmake 
Linking CXX shared library libSFMLwindow.dll 
Creating library file: libSFMLwindow.dll.a 
CMakeFiles\SFMLwindow.dir/objects.a(SFMLWindow.cpp.obj):SFMLWindow.cpp:(.text+0x59):undefined reference to `_imp___ZN2sf9VideoModeC1Ejjj' 
CMakeFiles\SFMLwindow.dir/objects.a(SFMLWindow.cpp.obj):SFMLWindow.cpp:(.text+0xda): undefined reference to `_imp___ZN2sf6WindowC1ENS_9VideoModeERKSsjRKNS_15ContextSettingsE' 
CMakeFiles\SFMLwindow.dir/objects.a(SFMLWindow.cpp.obj):SFMLWindow.cpp:(.text+0x163): undefined reference to `_imp___ZN2sf6Window5closeEv' 
CMakeFiles\SFMLwindow.dir/objects.a(SFMLWindow.cpp.obj):SFMLWindow.cpp:(.text+0x1bd): undefined reference to `_imp___ZN2sf6Window9pollEventERNS_5EventE' 
CMakeFiles\SFMLwindow.dir/objects.a(SFMLWindow.cpp.obj):SFMLWindow.cpp:(.text+0x1d8): undefined reference to `_imp___ZN2sf6Window7displayEv' 
collect2: ld a retourné 1 code d'état d'exécution 
mingw32-make.exe[2]: *** [libSFMLwindow.dll] Error 1 
mingw32-make.exe[1]: *** [CMakeFiles/SFMLwindow.dir/all] Error 2 
mingw32-make.exe: *** [all] Error 2 

तो किसी को क्या हो रहा है पर एक सुराग है, मैं बहुत gratefull होगी!

उत्तर

14

अनुमान में, आपकी SFMLwindow लाइब्रेरी को कुछ या सभी sfml-main, sfml-system, sfml-window से लिंक की आवश्यकता है।

आप करने के लिए अपने CMakeLists.txt के अंत को बदलने की कोशिश कर सकते:

add_library(
    ${LIBRARY_NAME} 
    SHARED 
    ${SRC_FILES} 
    ${INCLUDE_FILES} 
) 

add_executable(
    ${EXECUTABLE_NAME} 
    main.cpp 
) 

target_link_libraries(
    ${LIBRARY_NAME} 
    sfml-main 
    sfml-system 
    sfml-window 
) 

target_link_libraries(
    ${EXECUTABLE_NAME} 
    ${LIBRARY_NAME} 
) 


एक अलग रूप में के रूप में, file(GLOB_RECURSE... आम तौर पर एक तरह से स्रोतों की एक सूची इकट्ठा करने के लिए के रूप में पर सिकोड़ी है। file के लिए दस्तावेज़ों से:

हम आपके स्रोत पेड़ से स्रोत फ़ाइलों की सूची एकत्र करने के लिए GLOB का उपयोग करने की अनुशंसा नहीं करते हैं। यदि किसी स्रोत को जोड़ा या निकाला जाने पर कोई CMakeLists.txt फ़ाइल बदलती नहीं है तो जेनरेट बिल्ड सिस्टम को पता नहीं चल सकता कि सीएमके को पुन: उत्पन्न करने के लिए कहां से पूछना है।


इसके अलावा, find_library इस मामले में link_directories को प्राथमिकता दी जानी चाहिए। link_directories के लिए दस्तावेज़ों से:

ध्यान दें कि यह आदेश शायद ही आवश्यक है। Find_package() और find_library() द्वारा लौटाए गए लाइब्रेरी स्थान पूर्ण पथ हैं। इन पूर्ण लाइब्रेरी फ़ाइल पथ को सीधे target_link_libraries() कमांड पर पास करें। सीएमके सुनिश्चित करेगा कि लिंकर उन्हें पाता है।

+0

सहायता के लिए धन्यवाद, मैंने अपने CMakeLists.txt को संपादित किया, लेकिन यह अभी तक काम नहीं कर रहा है। लेकिन अजीब बात यह है कि, अगर मैं केवल निष्पादन योग्य बना रहा हूं, तो यह ठीक काम करता है, यह केवल तब होता है जब पुस्तकालय का निर्माण होता है जिसे मैं इस समस्या का सामना कर रहा हूं। और .o फाइलें बनने लगती हैं क्योंकि वे होना चाहिए। मेरा CmakeLists.txt अब: http://pastebin.com/hLux8Lvi – Cuthalion

+0

मुझे समस्या का पता चला! आप लिंकिंग समस्या के बारे में सही थे, लेकिन इसे सही करने के लिए, मुझे 2 target_link_libraries का उपयोग करना पड़ा। एक निष्पादन योग्य और पुस्तकालय के लिए दूसरा एक। मेरी दूसरी समस्या कमांड ऑर्डर थी। ऐसा लगता है कि * target_link_libraries * add_executable और add_library के बाद दिखाई देना चाहिए। यहां मेरा वर्तमान सेमेक है, और फिर, cmake के बारे में सामान्य जानकारी के लिए धन्यवाद और मेरी मदद करो! http://pastebin.com/ErgbGir0 – Cuthalion

+0

ठीक है - यह काम करता है खुश है। हमारे समाधानों के बीच मुख्य अंतर यह है कि आप स्रोतों को पुस्तकालय * और * exe दोनों में संकलित करते हैं। यह छोटी परियोजनाओं के लिए ठीक है, लेकिन यदि आपके पास बहुत सारी स्रोत फाइलें हैं तो दर्द हो जाता है। आम तौर पर, आप केवल लाइब्रेरी में स्रोतों को संकलित करेंगे, फिर उस लाइब्रेरी को टेस्ट एक्सई से लिंक करें।सीएमके के साथ, यदि आप निर्दिष्ट करते हैं कि lib ए lib पर निर्भर करता है, और exe Z lib ए पर निर्भर करता है, तो यह स्वचालित रूप से ज़ेड की निर्भरता के रूप में lib B को भी जोड़ता है। यही कारण है कि मैंने '$ {LIBRARY_NAME}' को '$ {EXECUTABLE_NAME}' की निर्भरता के रूप में निर्दिष्ट किया है। हालांकि कोई बड़ी बात नहीं :-) – Fraser

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