我正在尝试设置cmake
将头文件复制到特定位置,这样我就可以使用一个中心位置,当我使用库时可以访问头文件。我正在使用最小的代码集来测试它。目录结构如下所示:
src/
├── CMakeLists.txt
├── codepack
│ ├── CMakeLists.txt
│ ├── package.xml
│ └── src
│ └── code.cpp
└── libpack
├── CMakeLists.txt
├── package.xml
└── src
├── lib.cpp
├── lib.hpp
├── test.hpp
└── tt
├── tt.cpp
└── tt.hpp
libpack
创建了两个库tt
和libfunk
,然后由codepack
使用。下面的cmake
代码位于libpack
CMakeLists中,并将保留目录结构的头文件复制到include
的CMakeLists中引用的codepack
目录。 / p>
到目前为止,我有以下代码,它似乎有效,但在测试时,行为并不像预期的那样。
# find all header files in the source directory and subdirectories, and group them
file(GLOB_RECURSE headers src/*.hpp)
# remove previous versions of files (not sure how to replace only if modified)
file(REMOVE_RECURSE ${CATKIN_DEVEL_PREFIX}/include/${PROJECT_NAME})
# go through each of the matched files
foreach(header ${headers})
# replace the path, up to the point of the src directory, so that
# we end up with just the path below the src directory
string(REGEX REPLACE ".*${CMAKE_CURRENT_SOURCE_DIR}\\/src" "" belowsrc ${header})
# match directories in the path
# i.e. /foo/bar/item.hpp -> /foo/bar/
string(REGEX MATCH ".*\\/" DIR ${belowsrc})
# copy the header file to the include directory in catkin_ws/devel,
# under the package name, and preserving subdirectory structure
file(COPY ${header} DESTINATION ${CATKIN_DEVEL_PREFIX}/include/${PROJECT_NAME}${DIR})
endforeach(header)
最初我跳过file(REMOVE_RECURSE..)
步骤,因为我假设file(COPY)
可以这样工作,我可以期望将最新版本的标题复制到include目录。 tt.hpp
文件具有以下结构:
#include <iostream>
class tt {
public:
static void print();
};
如果我将文件置于此状态并进行编译,则一切都按预期工作。但是,如果我删除public:
声明,我没有看到我期望的错误('static void tt :: print()'是私有的),除非我手动删除include
目录到我正在复制标题,然后修改其中一个CMakeLists文件,我想这会产生一个新的编译。
我在这里做错了什么?
编辑:我已经检查了文件(REMOVE_RECURSIVE ...),只是为了确保正确删除目录,并且据我所知。