2016-12-30 119 views
1

我有一个用静态库构建CMake项目的问题。 我的项目strucutre看起来像这样:包含来自CMake静态库的头文件

Foo/ 
|-- CMakeLists.txt 
|-- lib/ 
    |-- CMakeLists.txt 
    |-- libA/ 
     |-- CMakeLists.txt 
     |-- libA.cpp 
     |-- libA.h 
     |-- libAB.h 
|-- src/ 
    |-- CMakeLists.txt 
    |-- main.cpp 
    |-- srcDirA/ 
     |-- CMakeLists.txt 
     |-- srcA.h 
    |-- srcDirB/ 
     |-- CMakeLists.txt 
     |-- srcB.cpp 
     |-- srcB.h 

而* /的CMakeLists.txt看起来像:

美孚/的CMakeLists.txt:

cmake_minimum_required(VERSION 3.5.1) 
project(FOO) 

set(CMAKE_CXX_STANDARD 11) 

add_subdirectory(lib) 
add_subdirectory(src) 

美孚/ lib中/的CMakeLists.txt :

add_subdirectory(libA) 

美孚/ LIB/LIBA /的CMakeLists.txt:

add_library (staticLibA STATIC libA.cpp) 

美孚/ SRC /的CMakeLists.txt:

add_subdirectory(srcDirA) 
add_subdirectory(srcDirB) 
include_directories(".") 

add_executable(foo main.cpp) 
target_link_libraries(foo LINK_PUBLIC libA) 

美孚/ SRC/srcDirA /的CMakeLists.txt是空

美孚/ SRC/srcDirB /的CMakeLists.txt是空

现在我试图将我的静态库中的头文件包含到我的主项目中,如下所示:

Foo/src/main.cpp:

#include "srcDirB/srcB.h" 
#include "libA/libA.h" 

int main() { 
    //... 
    return 0; 
} 

如果我尝试用CMake的,力霸建设,这是产生,但我得到一个致命的错误:

libA/libA.h: No such file or directory.

有谁知道我做错了吗?我必须create a ProjectConfig.cmake file

回答

1

您不需要创建任何配置文件;这些用于导入第三方项目。

由于您使用CMake> = 3.5.1,因此您可以为您的库指定usage requirements。使用要求是像标志或包括目录客户需要与库建立。

所以在富/ lib目录/力霸/的CMakeLists.txt:,你会做到这一点:

add_library (staticLibA STATIC libA.cpp) 
target_include_directories(staticLibA INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/..) 

或者,如果你想在同一目录包括适用于力霸本身(这是可能的),使用PUBLIC而不是INTERFACE

这就是你真正需要做的。但是,考虑到您正在使用的现代CMake,您应该使用旧版关键字LINK_PUBLIC替代其现代版本PUBLIC

此外,既然您提到两个CMakeLists在.../srcDir*都是空的,为什么他们在那里呢?您可以轻松摆脱他们和相关的add_subdirectory电话。