CMake配置项目

时间:2016-02-22 13:32:59

标签: c++ 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)

使用此配置时,它无法识别 mylib alib 依赖关系。特别是(我在Windows下开发)我收到了这个错误:

  

/usr/lib/gcc/x86_64-pc-cygwin/4.9.3 /../../../../ x86_64的-PC-cygwin的/ bin中/ LD:   找不到-lalibName.lib

我无法弄清楚如何正确地做到这一点。有什么建议吗?

2 个答案:

答案 0 :(得分:0)

似乎alib项目没有像mylib那样指定任何类型的库目标:

尝试将此添加到alibs的CMake文件

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

答案 1 :(得分:0)

静态库不能具有依赖关系(好吧,它们可以,但它们不会自己拖动它们),因此在alib中为另一个静态库提供target_link_libraries(...)没有意义。您应该直接向alib命令提供add_execuable

或者,您可以从mylibalib构建一个大的静态库,但它不那么优雅并且依赖于平台。对于gcc,您应该查看ar工具。

删除add_subdirectory(alib)命令,然后从alib子文件夹中删除CMake文件 - 您不需要它。然后在你的add_executable命令的cmake文件中放入以下内容(在行之后);

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