我是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
,其中包括lib1
和lib2
。
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.txt
(root/lib
)
add_subdirectory(lib1)
add_subdirectory(lib2)
CMakeLists.txt
(root/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.txt
(root/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.txt
(root/cmaketutorial
)
# add the executable
add_executable(cmaketutorial cmaketutorial.c)
target_include_directories(
cmaketutorial PUBLIC
"${PROJECT_BINARY_DIR}"
)
使用当前的CMakeFiles *
编译cmaketutorial.c
时,它无法链接lib1
和lib2
。
如何修改常规CMakeFiles.txt
,以便一切正常进行?
我可以使用CMakeFiles.txt
和lib1
的原始lib2
吗?
还可以设置cmaketutorial.c
和#include <lib/lib1.h>
形式的#include <lib/lib2.h>
中包含的项目吗?
答案 0 :(得分:2)
如何修改常规CMakeFiles.txt,以使一切正常进行?
您必须将cmaketutorial
可执行文件与lib1
和lib2
库链接。将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
规则。