Cmake 我可以从上面的文件夹添加库吗?

Cmake 我可以从上面的文件夹添加库吗?,cmake,Cmake,我无法将静态库添加到项目中 我有以下项目结构: + root/ + CmakeLists.txt // Include all projects + Base/ | + foo.cpp | + CmakeLists.txt + App1/ | + app1.cpp | + CmakeLists.txt // Requires Base lib + App2/ | + app2.cpp | + CmakeLists.txt // Requires Base

我无法将静态库添加到项目中

我有以下项目结构:

+ root/
  + CmakeLists.txt // Include all projects
  + Base/
  | + foo.cpp
  | + CmakeLists.txt
  + App1/
  | + app1.cpp
  | + CmakeLists.txt // Requires Base lib
  + App2/
  | + app2.cpp
  | + CmakeLists.txt // Requires Base lib
我试着用以下方法来做:

Base
CmakeLists.txt:

cmake_minimum_required(VERSION 3.10.2)

add_library(Base STATIC foo.cpp)
cmake_minimum_required(VERSION 3.10.2)

project(App1)
add_executable(${CMAKE_PROJECT_NAME} app1.cpp)

include(../Base/CMakeLists.txt)
App1
CmakeLists.txt:

cmake_minimum_required(VERSION 3.10.2)

add_library(Base STATIC foo.cpp)
cmake_minimum_required(VERSION 3.10.2)

project(App1)
add_executable(${CMAKE_PROJECT_NAME} app1.cpp)

include(../Base/CMakeLists.txt)
但我有以下错误:

CMake Error at C:/DPA/Base/CMakeLists.txt:3 (add_library):
  Cannot find source file:

    foo.cpp

如何正确设置库以包含在所有项目中?

这不是使用此类目录结构的方式。相反,在App1/CmakeLists.txt中,使用

add_executable(App1 app1.cpp)
target_link_libraries(App1 Base)
这表明
App1
依赖于
Base
,并应与该库链接。“链接”不仅意味着将正确的参数传递给链接器,还意味着在构建
App1
源时将include标志和其他选项传播给编译器

如果您打算只构建项目的一部分,则可以使用附加参数来添加可执行文件,即

add_executable(App1 EXCLUDE_FROM_ALL app1.cpp)
这样,当您构建默认目标时,
App1
将不会成为构建的一部分。您仍然可以手动/根据请求构建它,例如,在使用makefiles时

make App1

将生成可执行的
App1
和它所需的一切。

最后一段有误导性:
Base
不需要定义
target\u link\u库(App1 Base)
才能正常工作,所以子目录添加的顺序无关紧要。@Angew谢谢,我不知道!谢谢你的解释!但是如果我还想只构建
App1
,我怎么能在
App1
中包含
Base
?如果
App1
依赖于
Base
,你想如何“只构建
App1
”?@Tsyvarev这根本不是真的。它是否是目标的区别是在生成时完成的,而不是在配置时处理
target\u link\u库时完成的。我们的构建系统在很大程度上依赖于此,我刚刚在一个小示例中验证了它。