2014-05-15 65 views
8

我正在處理一個包含3個服務器可執行文件和一個共享代碼庫的項目。我希望它是跨平臺的,所以我使用CMake來處理構建過程(因爲無論如何Xcode都是痛苦的)。我在設置CMakeLists時遇到了麻煩,所以我在構建可執行文件時可以從同一級別的目錄中包含庫。CMake:使用靜態庫在一個項目中構建多個可執行文件

這裏的目錄結構(與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}) 

TET 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將從每個子目錄並繼承目標patch_server中的一個將可以訪問tethealla庫。但是我想要的是能夠從這些子目錄中生成Xcode項目,以便我可以單獨編譯/重新編譯它們。爲此,我需要能夠訪問libtethealla/build目錄(其中CMake輸出)以從patch_server訪問libtethealla.a庫。這可能嗎?

在另一種說法中,即使從頂層目錄構建,我在patch_server中的源代碼也不能包含加密中庫的頭文件「encryption.h」。這似乎正在建設好。任何想法都非常感謝!

回答

14

我的解決方案是使用add_subdirectory和shared_lib目錄的相關補丁。我不認爲這是它有它的注意事項的完美解決方案:

  • 邏輯非常相似,頭文件保護必須添加到庫中的CMakeLists.txt從確定目標多次阻止。
  • 每個CMakeList.txt文件都必須知道庫的相關補丁,如果需要移動庫,則必須更新所有CMakeLists。

假設目錄結構是這樣的:

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() 
相關問題