2016-06-09 78 views
2

我有一个C++库项目,它附带一个examples文件夹。这些例子是独立的,即它们可以在没有源码树的其余部分的情况下编译,就好像它们是使用该库的真实应用程序一样。他们使用提供的FindMyLib.cmake在系统中查找已安装的库。是否可以将cmake项目链接到子项目?

我想能够与整个图书馆一起构建它们。起初,我加入他们作为子目录:

if(MYLIB_BUILD_EXAMPLES) 
    add_subdirectory(examples/fooexample) 
    add_subdirectory(examples/barexample) 
endif() 

但是,这是行不通的,因为我不能用find_package安装库之前。我可以将默认构建目录添加到搜索路径中,但这还不够,因为在cmake运行时显然没有构建库。

我能做些什么来解决这个问题?有没有一种方法可以在构建库时透明地将库链接到这些子项目(还可以“禁用”find_package,因为它必然会在没有安装的情况下失败)。

回答

2

刚准备FindMyLib.cmake,可链接到使用构建树库,而不是一个安装之一。例如,它可能变MyLib_LIBRARY变量设置为库目标

cmake的建造/ FindMyLib.cmake

set(MyLib_LIBRARY MyLib) 
set(MyLib_INCLUDE_DIRECTORIES ${CMAKE_SOURCE_DIR}/include) 
... 

然后在前面加上CMAKE_MODULE_PATH清单与目录,包含假脚本。这样的方式,将用于例子:

if(MYLIB_BUILD_EXAMPLES) 
    set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake-build ${CMAKE_MODULE_PATH}) 
    add_subdirectory(examples/fooexample) 
    add_subdirectory(examples/barexample) 
endif() 
+0

除非我错过了什么,这是不行的:为例子的配置步骤会导致一个错误,因为该库将不会被尚未建成, – piwi

+0

如果库中添加(用'add_library(MyLib中)' )*之前*'add_subdirectory(examples/...)',然后'target_link_libraries(fooexample $ {MyLib_LIBRARY})'像往常一样与** target **链接。图书馆目标不需要在这个阶段建立。 – Tsyvarev

+0

我的不好,谢谢澄清。 – piwi

1

一个解决办法是检查,在你的例子,即建立MyLib目标是否存在,并使用它,如果它不依赖;否则调用find_library()

add_library(MyLib ...) 

# examples/fooexample 
if(NOT TARGET MyLib) 
    find_library(MyLib) 
endif() 

add_executable(foo) 

if(TARGET MyLib) 
    add_dependencies(foo MyLib) 
endif()