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库时完成的。我们的构建系统在很大程度上依赖于此,我刚刚在一个小示例中验证了它。