2016-02-22 120 views
0

我有一個關於cmake項目配置的問題。CMake配置項目

以下是我的項目結構。

trunk 
    | 
    |---- mylib 
    |  | 
    |  ---- mylib.h 
    |  ---- mylib.c 
    |  ---- *MYLIB_CMakeList.txt* 
    | 
    |---- alib 
    |  | 
    |  ---- alib.h 
    |  ---- alibName.lib 
    |  ---- *ALIB_CMakeList.txt* 
    | 
    | 
    |---- main 
    |  | 
    |  ---- main.cpp 
    |  ---- *MAIN_CMakeList.txt* 
    |  
     ---- *TOP_CMakeList.txt* 

MYLIB子文件夾中包含源代碼(C)創建自己的靜態庫。此代碼取決於alib

main子文件夾包含使用mylib的示例代碼(C++)。

下面是我寫我的CMakeList文件:

**TOP_CMakeList.txt** 
cmake_minimum_required(VERSION 3.4) 

add_subdirectory(mylib) 
add_subdirectory(alib) 
add_subdirectory(main) 

------------------------------------------------------------------------------------------------------------ 

**MYLIB_CMakeList.txt** 
cmake_minimum_required(VERSION 3.4) 
project(MyLib C) 

if (WIN32) 
    set(CMAKE_SHARED_LIBRARY_PREFIX "") 
endif() 

include_directories(${alib_INCLUDE_DIRS}) 

add_library(${PROJECT_NAME} STATIC mylib.c) 

target_link_libraries(${PROJECT_NAME} alib) 

set(${PROJECT_NAME}_DEFINITIONS CACHE INTERNAL "${PROJECT_NAME}: Definitions" FORCE) 
set(${PROJECT_NAME}_INCLUDE_DIRS ${PROJECT_SOURCE_DIR} CACHE INTERNAL "${PROJECT_NAME}: Include Directories" FORCE) 

------------------------------------------------------------------------------------------------------------ 

**ALIB_CMakeList.txt** 
cmake_minimum_required(VERSION 3.4) 
project(ALib) 


set(${PROJECT_NAME}_DEFINITIONS CACHE INTERNAL "${PROJECT_NAME}: Definitions" FORCE) 
set(${PROJECT_NAME}_INCLUDE_DIRS ${PROJECT_SOURCE_DIR} CACHE INTERNAL "${PROJECT_NAME}: Include Directories" FORCE) 

------------------------------------------------------------------------------------------------------------ 


**MAIN_CMakeList** 

make_minimum_required(VERSION 3.4) 

project(Executable CPP) 

file(GLOB CPP_FILES *.cpp) 

add_definitions(${MyLib_DEFINITIONS}) 

include_directories(${MyLib_INCLUDE_DIRS}) 

add_executable(${PROJECT_NAME} ${CPP_FILES}) 

target_link_libraries(${PROJECT_NAME} MyLib) 

有了這樣的配置不承認MYLIBalib依賴。特別是(我在Windows下開發)我得到這個錯誤:

/usr/lib/gcc/x86_64-pc-cygwin/4.9.3/../../../../x86_64-pc-cygwin/bin/ld: cannot find -lalibName.lib

我想不出如何正確地做到這一點。有什麼建議麼?

+0

「[我]不工作」不幸是不是一個很好的問題描述。你能否詳細說明*如何不起作用?它是否以錯誤的順序構建?運行CMake的錯誤?還有其他的東西嗎? –

回答

0

似乎alib項目不指定任何種類庫的目標一樣MYLIB做:

嘗試增加這alibs' CMake的文件

add_library(${PROJECT_NAME} STATIC <<< alib SOURCES HERE >>>) 
+0

謝謝fritzone,但alib項目只包含一個.lib文件和.h文件。在這種情況下,我沒有源代碼 – cq5beginner

+1

@ cq5beginner,您不需要它的CMake文件。只需使用'link_directories'(https://cmake.org/cmake/help/v3.0/command/link_directories.html)和'target_link_libraries'(https://cmake.org/cmake/help/v3.0/command /target_link_libraries.html)爲您的mylib,並指定目錄的.lib文件是 – fritzone

+0

我試過,但我得到這個錯誤'沒有規則,使目標....需要...'在建設 – cq5beginner

0

靜態庫不能有依賴關係(好吧,他們可以,但是他們不會自己拖動它們),所以在target_link_libraries(...)中爲另一個靜態庫提供alib沒有意義。您應該直接向add_execuable命令提供alib

或者,您可以從mylibalib中構建一個很大的靜態庫,但它不夠優雅並且不依賴於平臺。對於gcc你應該看看ar工具。


取出add_subdirectory(alib)命令,然後從alib子文件夾中刪除的CMake文件 - 你不需要它。然後在你有你的add_executable命令的cmake文件中加入以下內容(在該行後面);

link_directories(../alib) 
target_link_libraries(${PROJECT_NAME} alibName.lib) 
+0

感謝您的答案。我仍然得到'沒有規則,使目標aLibName.lib,所需的main/Main.exe' – cq5beginner

+0

@ cq5beginner,更新了答案 – ixSci