2012-05-14 13 views
6

पर सीएमके के साथ साझा लाइब्रेरी में बढ़ावा जोड़ने को जोड़ने के लिए मेरे पास एक प्रोजेक्ट और एक प्रोजेक्ट लाइब्रेरी है। साझा लाइब्रेरी बूस्ट लाइब्रेरी का उपयोग करती है। निष्पादन योग्य साझा पुस्तकालय olny का उपयोग करता है।लिनक्स

tilenet/    <-- Project 
    ttest/   <-- Test (executable) 
     CMakeLists.txt 
    tilenet/   <-- The shared library 
     CMakeLists.txt 
    CMakeLists.txt <-- Root CMake-file 

रूट CMake-फ़ाइल:

cmake_minimum_required(VERSION 2.6) 

project(tilenet) 

set(Boost_USE_STATIC_LIBS  OFF) # I've already tried ON 
set(Boost_USE_MULTITHREADED  ON) 
set(Boost_USE_STATIC_RUNTIME OFF) 


find_package(Boost 1.49 COMPONENTS system filesystem REQUIRED) 

include_directories(${Boost_INCLUDE_DIRS}) 

add_subdirectory(test) 
add_subdirectory(tilenet) 

ttest/CMakeLists.txt

add_executable(ttest test.cpp) 
target_link_libraries(ttest tilenet ${BOOST_LIBRARIES}) 

tilenet/CMakeLists.txt

include_directories("include") 
set(tilenet_src "src/tilenet.cpp" ...) 

add_library(tilenet SHARED ${tilenet_src}) 
target_link_libraries(tilenet 
      ${SFML_LIBRARIES} 
      ${BOOST_LIBRARIES} 
      ) 

(मैं कुछ महत्वहीन काट लिया सामान)

खिड़कियों पर यह ठीक काम करता है (लेकिन वहाँ मैं CMake बिना VisuelStudio का उपयोग करें), लेकिन लिनक्स पर मैं जोड़ने त्रुटियों निम्नलिखित हो:

../../lib/libtilenet.so: undefined reference to `boost::filesystem3::path_traits::convert(wchar_t const*, wchar_t const*, std::string&, std::codecvt<wchar_t, char, __mbstate_t> const&)' 
../../lib/libtilenet.so: undefined reference to `boost::filesystem3::path::operator/=(boost::filesystem3::path const&)' 
../../lib/libtilenet.so: undefined reference to `boost::system::system_category()' 
../../lib/libtilenet.so: undefined reference to `boost::filesystem3::path::wchar_t_codecvt_facet()' 
../../lib/libtilenet.so: undefined reference to `boost::system::generic_category()' 
../../lib/libtilenet.so: undefined reference to `boost::filesystem3::path_traits::convert(char const*, char const*, std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&, std::codecvt<wchar_t, char, __mbstate_t> const&)' 
collect2: error: ld returned 1 exit status 
make[2]: *** [../bin/ttest] Error 1 
make[1]: *** [test/CMakeFiles/ttest.dir/all] Error 2 
make: *** [all] Error 2 

मैं दिए गए विकल्पों के साथ संयोजन का एक बहुत कोशिश की है, लेकिन मैं नहीं था इसे जोड़ने में सक्षम क्या आप जानते हैं कि मैंने गलतियां कहाँ की हैं? यह पहली बार है जब मैंने गंभीरता से सीएमके का उपयोग किया है :)

उत्तर

7

सीएमके चर के मामले संवेदनशील हैं, और FindBoost मॉड्यूल Boost_LIBRARIES नामक चर के लिए बूस्ट लाइब्रेरी सेट करता है, BOOST_LIBRARIES नहीं।

यदि आप ${BOOST_LIBRARIES} को ${Boost_LIBRARIES} के साथ अपने दो target_link_libraries कॉल में प्रतिस्थापित करते हैं और इसे सही तरीके से काम करना चाहिए।

FindBoost मॉड्यूल पर पूर्ण जानकारी के लिए, चलाएँ:

cmake --help-module FindBoost 
+0

ठीक अब मैं सब कुछ संकलन कर सकते हैं (और एक विभाजन गलती मिल;) nerver मन) लेकिन मैं ttest निष्पादन को बढ़ावा लिंक करने के लिए की है। साझा पुस्तकालय के अंदर बढ़ावा छिपाना संभव है? – Databyte

+1

सुनिश्चित नहीं है कि आपका क्या मतलब है। एक बार जब आप 'tilenet' की निर्भरता के रूप में बढ़ावा libs निर्दिष्ट करते हैं, जब भी आप किसी अन्य लक्ष्य की निर्भरता के रूप में 'tilenet' निर्दिष्ट करते हैं, तो सीएमके स्वचालित रूप से आगे निर्भरताओं के रूप में बढ़ावा libs को पहचानता है। दूसरे शब्दों में, किसी अन्य 'target_link_libraries' कॉल में' $ {BOOST_LIBRARIES} 'को स्पष्ट रूप से सूचीबद्ध करने की आवश्यकता नहीं है यदि इसमें पहले से ही' tilenet' है। – Fraser

+0

ठीक है अच्छा लगता है धन्यवाद – Databyte