CMake:在项目中包含库

时间:2020-03-15 12:26:01

标签: c cmake

我是CMake的新手,我需要帮助。 我正在尝试开发以下cmaketutorial项目:

.
├── CMakeLists.txt
├── lib
│   ├── CMakeLists.txt
│   ├── lib1
│   │   ├── CMakeLists.txt
│   │   └── lib1.h
│   └── lib2
│       ├── CMakeLists.txt
│       ├── lib2.c
│       └── lib2.h
└── cmaketutorial
    ├── CMakeLists.txt
    └── cmaketutorial.c

lib1:通用库。它仅包含.h,其CMakeFiles.txt允许您将其安装在/usr/local/include中。

lib2:通用库。它包含.c和.h,其CMakeFiles.txt允许您将其安装在/usr/local/include中。

lib1 and lib2:它们是两个独立存在的库,来自各自的项目。

cmaketutorial:这是一个有问题的项目,它包含一个.c,其中包括lib1lib2

CMakeLists.txt (root)

cmake_minimum_required(VERSION 3.12)
project(
    cmaketutorial
    VERSION 0.0.1
    LANGUAGES C
)

add_definitions(-D_GNU_SOURCE)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Werror -pedantic -Wno-unused-parameter")

add_subdirectory(lib)
add_subdirectory(cmaketutorial)

CMakeLists.txtroot/lib

add_subdirectory(lib1)
add_subdirectory(lib2)

CMakeLists.txtroot/lib/lib1

cmake_minimum_required(VERSION 3.12)
project(
    lib1
    VERSION 0.0.1
    LANGUAGES C
)

add_library(${PROJECT_NAME} INTERFACE)

target_include_directories(
    lib1
    INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}
)

# install rules
install(FILES lib1.h DESTINATION include)

CMakeLists.txtroot/lib/lib2

cmake_minimum_required(VERSION 3.12)
project(
    lib2
    VERSION 0.0.1
    LANGUAGES C
)

if(CMAKE_CURRENT_BINARY_DIR)
    set(CMAKE_CURRENT_BINARY_DIR ${CMAKE_CURRENT_SOURCE_DIR})
endif(CMAKE_CURRENT_BINARY_DIR)

add_library(
    ${PROJECT_NAME}
    lib2.c
    ${CMAKE_CURRENT_BINARY_DIR}/lib2.h
)

target_include_directories(
    ${PROJECT_NAME}
    INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}
    PRIVATE ${CMAKE_CURRENT_BINARY_DIR}
)

install(TARGETS ${PROJECT_NAME} DESTINATION lib)
install(FILES lib2.h DESTINATION include)

CMakeLists.txtroot/cmaketutorial

# add the executable
add_executable(cmaketutorial cmaketutorial.c)

target_include_directories(
    cmaketutorial PUBLIC
    "${PROJECT_BINARY_DIR}"
)

使用当前的CMakeFiles *编译cmaketutorial.c时,它无法链接lib1lib2。 如何修改常规CMakeFiles.txt,以便一切正常进行? 我可以使用CMakeFiles.txtlib1的原始lib2吗?

还可以设置cmaketutorial.c#include <lib/lib1.h>形式的#include <lib/lib2.h>中包含的项目吗?

1 个答案:

答案 0 :(得分:2)

如何修改常规CMakeFiles.txt,以使一切正常进行?

您必须将cmaketutorial可执行文件与lib1lib2库链接。将target_link_libraries (cmaketutorial PUBLIC lib1 lib2)添加到cmaketutorial/CMakeLists.txt

我可以设置在cmaketutorial.c中包含的项目为#include和#include吗?

将这些文件移动到适当的目录中。也是这样:

mkdir lib/lib1/lib lib/lib2/lib
mv lib/lib1/lib1.h lib/lib1/lib
mv lib/lib2/lib2.h lib/lib2/lib/lib2.h

,然后用lib/lib2/CMakeLists.txt更新add_library(... lib/lib2.h),并在需要时更新所有install规则。

相关问题