我不能完全确定externalproject_Add是否为我可以在其上找到的大多数示例,都是关于下载git etc /,但也许就这样...
基本上我有:
FolderA // inherited project
> main.cpp
> CMakeList.txt
> libFolder
>someStuff.h
>someStuff.cpp
FolderB // base project
> main.cpp
> CMakeList.txt
> libFolder_Core
>someStuff_Core.h
>someStuff_Core.cpp
我不想每次更改文件夹B中的项目时都必须构建static / dynamic / etc lib,我只想在我的文件夹A中包含该文件夹中的CMakeList.txt,FolerB cmake仅包含一些内容喜欢
set(headers xx.h)
set(source xx.cpp)
set(all ${headers} ${source})
只是想在projectA,cmake中说一句话
get_filename_component(libs"${CMAKE_CURRENT_SOURCE_DIR}/.." ABSOLUTE)
SET(coreLib ${libs}/someCoreLib/)
add_executable(name, main.cpp ${coreLib})
有这种可能吗?
答案 0 :(得分:1)
您可以使用导出的目标和程序包注册表,使用现代CMake轻松地做到这一点。
在项目A中:
add_library(projecta a.cpp b.cpp c.cpp)
add_library(projecta::projecta ALIAS projecta)
target_include_directories(projecta PUBLIC ...)
install(TARGETS projecta EXPORT projectaTargets
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
RUNTIME DESTINATION bin
INCLUDES DESTINATION include
)
install(
EXPORT projectaTargets
NAMESPACE projecta::
FILE projectaConfig.cmake
DESTINATION lib/cmake/projecta
)
export(
EXPORT projectaTargets
FILE "${CMAKE_CURRENT_BINARY_DIR}/projectaConfig.cmake"
)
export(PACKAGE projecta)
这将成为projecta
的目标,并将目标导出给其他项目使用。
如果项目A本身具有依赖项,请考虑将目标导出到目标文件,然后生成一个配置文件,该文件还可以找到依赖项的程序包。在It's Time To Do CMake Right博客文章中有更多相关内容。
然后,在项目B中:
find_package(projecta REQUIRED)
add_executable(projectb x.cpp y.cpp z.cpp)
# link project b to project a,
# adding include directories and link dependencies
target_link_libraries(projectb PUBLIC projecta::projecta)