2014-05-15 7 views
8

के साथ एक प्रोजेक्ट में एकाधिक एक्जिक्यूटिव बनाएं, मैं एक ऐसे प्रोजेक्ट पर काम कर रहा हूं जिसमें 3 सर्वर एक्जिक्यूटिव और साझा कोड के लिए एक लाइब्रेरी शामिल है। मैं इसे क्रॉस-प्लेटफार्म बनना चाहता हूं, इसलिए मैं निर्माण प्रक्रिया को संभालने के लिए सीएमके का उपयोग कर रहा हूं (चूंकि एक्सकोड एक दर्द है)। मुझे सीएमकेलिस्ट स्थापित करने में परेशानी हो रही है ताकि जब मैं निष्पादन योग्य बना रहा हूं तो मैं उसी स्तर पर निर्देशिका से लाइब्रेरी को शामिल कर सकता हूं।सीएमके: स्टेटिक लाइब्रेरी

यहाँ निर्देशिका संरचना (और CMake फ़ाइलें) है:

tethealla2.0/ 
    CMakeLists.txt 
    libtethealla/ 
     CMakeLists.txt 
     encryption/ 
     utils/ 
    patch_server/ 
     CMakeLists.txt 
    login_server/ 
     CMakeLists.txt 
    ship_server/ 
     CMakeLists.txt 

मेरे उच्च-स्तरीय CMake (tethealla2.0/CMakeLists.txt, केवल उप परियोजना है कि संकलन चाहिए शामिल है):

project(tethealla CXX) 
cmake_minimum_required(VERSION 2.6) 

add_subdirectory(libtethealla) 
add_subdirectory(patch_server) 

tethealla2.0/libtethealla/CMakeLists.txt है, जो एक स्थिर पुस्तकालय उत्पन्न करता है:

project(Libtethealla C) 
cmake_minimum_required(VERSION 2.6) 

include_directories(encryption) 

set(ENC_DR encryption/) 

set(ENCRYPTION_SOURCES 
    ${ENC_DR}/psobb-crypt.c 
    ${ENC_DR}/psogc-crypt.c 
    ${ENC_DR}/psobb-crypt.c 
    ${ENC_DR}/encryption.c 
) 

add_library(tethealla STATIC ${ENCRYPTION_SOURCES}) 

टीईटी healla2.0/patch_server/CMakeLists.txt अब तक:

project(patch_server CXX) 
cmake_minimum_required(VERSION 2.6) 

add_executable(server main.cc) 
target_link_libraries(server tethealla) 

तो यह अधिक समझ में आता है अगर मैं इसे tethealla2.0 के बाद से शीर्ष स्तर से निर्माण/CMakeLists.txt उपनिर्देशिका में से प्रत्येक और से लक्ष्य प्राप्त कर लेंगे पैच_सेवर में से एक को टेथेहेला लाइब्रेरी तक पहुंच होगी। हालांकि, मैं चाहता हूं कि एक्सकोड परियोजनाओं को उत्पन्न करने के लिए इन उपनिर्देशिकाओं के भीतर से निर्माण करने में सक्षम होना चाहिए ताकि मैं उन्हें व्यक्तिगत रूप से/पुनः संयोजित कर सकूं। ऐसा करने के लिए मुझे libtethealla /a निर्देशिका (जहां सीएमके आउटपुट) को patch_server से libtethealla.a लाइब्रेरी तक पहुंचने के लिए प्राप्त करने में सक्षम होना चाहिए। क्या यह संभव है?

एक और नोट पर, शीर्ष स्तर की निर्देशिका से निर्माण में भी पैच_सेवर में मेरे स्रोत में एन्क्रिप्शन में लाइब्रेरी के लिए हेडर फ़ाइल "एन्क्रिप्शन.h" शामिल नहीं हो सकती है। जो ठीक लग रहा है प्रतीत होता है। उस पर किसी भी विचार की भी सराहना की जाती है!

उत्तर

14

मेरा समाधान share_lib निर्देशिका में सापेक्ष पैच के साथ add_subdirectory का उपयोग करना है। मुझे नहीं लगता कि यह एक सटीक समाधान इसे अपनी चेतावनियां है है:

  • तर्क बहुत एक हैडर गार्ड के समान लक्ष्य को कई बार परिभाषित करने से रोकने के लिए पुस्तकालय CMakeLists.txt में जोड़ा जाना चाहिए।
  • प्रत्येक CMakeList.txt फ़ाइल को पुस्तकालय में सापेक्ष पैच पता होना चाहिए, यदि कोई लाइब्रेरी ले जाना चाहता है तो सभी सीएमकेलिस्ट अपडेट किए जाने चाहिए।

की कि निर्देशिका संरचना इस तरह दिखता है मान लेते हैं:

root/ 
    CMakeLists.txt 
    shared_lib/ 
     CMakeLists.txt 
     inc/ 
      foo.h 
     src/ 
      foo.c 
    exec1/ 
     CMakeLists.txt 
     main.c 
    exec2/ 
     CMakeLists.txt 
     main.c 

जड़/CMakeList.txt

cmake_minimum_required(VERSION 2.6) 

add_subdirectory(shared_lib) 

add_subdirectory(exec1) 
add_subdirectory(exec2) 

मुझे लगता है कि shared_lib का फैसला किया है/CMakeLists.txt SHARED_DIR_INCLUDE_DIR नामक एक चर निर्यात करेगा । यह दृष्टिकोण चीजों को कम करने में मदद करता है।

जड़/exec1/CMakeLists.txt

cmake_minimum_required(VERSION 2.6) 

add_subdirectory(./../shared_lib shared_lib) 

include_directories(${SHARED_LIB_INCLUDE_DIR}) 

set(SRCS main.c) 
add_executable(exec1 ${SRCS}) 
target_link_libraries(exec1 shared_lib) 

if() चौथी पंक्ति में मामला CMakeLists फ़ाइल कई बार जोड़ा जाता है में लक्ष्य के कई परिभाषा के साथ इस मुद्दे को हल करती है।दूसरी और तीसरी पंक्ति में SHARED_LIB_INCLUDE_DIR

जड़ पुस्तकालय के लिए निर्देशिका में शामिल निर्यात/shared_lib/CMakeLists.txt

cmake_minimum_required(VERSION 2.6) 

set(SHARED_LIB_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/inc) 

set(SHARED_LIB_INCLUDE_DIR ${SHARED_LIB_INCLUDE_DIR} PARENT_SCOPE) 

if(TARGET shared_lib) 

message("shared_lib is already defined") 

else() 

include_directories(${SHARED_LIB_INCLUDE_DIR}) 

set(LIB_SRCS ./src/foo.c) 

add_library(shared_lib STATIC ${LIB_SRCS}) 

endif() 
संबंधित मुद्दे