问题引入
在项目中通常会遇见这样的情况:(例如一个项目中有:main
,libhello.a
, libworld.a
),当项目过小的时候,编译顺序是*.a
,然后是main
,但是当一个项目的文件过于庞大,就会导致编译的顺序不会按照主CMAKE
的add_subdirectory
引入的先后顺序,为了解决这一问题,就需要使用add_dependencies
进行依赖指定。
问题解决
该样例的工程结构如下:
├── CMakeLists.txt// 下面用主CMAKE表示
├── hello
│ ├── CMakeLists.txt // 下面用HELLOCMAKE表示
│ ├── hello.c
│ └── hello.h
├── main
│ ├── CMakeLists.txt // 下面用MAINCMAKE表示
│ └── main.c
└── world
├── CMakeLists.txt // 下面用WORLDCMAKE表示
├── world.c
└── world.h
HELLOCMAKE
的内容:
cmake_minimum_required(VERSION 3.5.1)
set(CMAKE_C_STANDARD 99)
add_library(hello STATIC world.c hello.h)
MAINCMAKE
的内容
cmake_minimum_required(VERSION 3.5.1)
project(CmakeDemo C)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY /home/lib)
set(CMAKE_C_STANDARD 99)
add_executable(CmakeDemo main.c)
link_directories(/home/lib)
target_link_libraries(
CmakeDemo
hello
world
)
WORLDCMAKE
的内容
cmake_minimum_required(VERSION 3.5.1)
set(CMAKE_C_STANDARD 99)
add_library(world STATIC world.c world.h)
主CMAKE
的内容
cmake_minimum_required(VERSION 3.5)
add_subdirectory(main)
add_subdirectory(hello)
add_subdirectory(world)
add_dependencies(CmakeDemo hello world)
- 注意点提示:
- 该示例中只有在
主CMAKE
中使用到add_dependencies
。 add_dependencies
中所填写的名字应该是其他CMAKE
生成目标的名字。- 该示例中如果写成
add_dependencies(CmakeDemo libhello.a libworld.a)
则会报错。
- 该示例中只有在
总结
这样写的好处在于,当一个项目构建的时候,由于依赖关系的存在,所以被依赖的项目总是最先构建,这样就不会出现找不到库而报错。