C++ 构建我的c++;与cmake合作的项目?

C++ 构建我的c++;与cmake合作的项目?,c++,compilation,makefile,cmake,C++,Compilation,Makefile,Cmake,我已经为此挣扎了很长一段时间,我与cmake的冒险只产生了一些我非常确定是不正确的黑客解决方案 我创建了一个由多个文件组成的库,如下所示: -libfolder -codepart1folder -CMakeLists.txt -codepart1.cpp -codepart1.hpp -codepart2folder -codepart3folder -lib.cpp -lib.hpp -CMakeLists.txt 我编写了一个CMakeLi

我已经为此挣扎了很长一段时间,我与cmake的冒险只产生了一些我非常确定是不正确的黑客解决方案

我创建了一个由多个文件组成的库,如下所示:

-libfolder
  -codepart1folder
    -CMakeLists.txt
    -codepart1.cpp
    -codepart1.hpp
  -codepart2folder
  -codepart3folder
  -lib.cpp
  -lib.hpp
  -CMakeLists.txt
我编写了一个CMakeLists文件来编译库(在一些实验之后),我可以生成一个lib.a文件。现在,我想将此代码作为库包含在其他项目中,并通过lib.hpp中的接口访问它。在目录结构方面,最好的方法是什么?我需要在根项目的CMakeLists.txt中输入什么

我当前的尝试是将-libfolder作为子文件夹添加到当前项目中,并添加以下命令:

include_directories(${PROJECT_SOURCE_DIR}/libfolder)
link_directories(${PROJECT_BINARY_DIR}/libfolder)
add_subdirectory(libfolder)
target_link_libraries(project lib)
当我运行make时,库可以很好地编译,但当project.cpp编译时,它会抱怨找不到codepart1.hpp(包含在lib.hpp中,包含在project.cpp中)


我怀疑这样做是错误的,但我无法通过CMake文档找到一个关于设置这样的项目的好教程。请帮帮我,CMake大师

将一个CMake项目导入另一个项目的干净方法是通过命令。包声明是使用命令完成的。使用find_包的一个优点是它不需要硬编码到包文件的路径


关于丢失的hpp文件,您没有包含codepart1folder,因此它不在包含路径上。

查看您的帖子,您似乎没有将“codepart1folder”添加到包含的任何位置。如何将codepart1.hpp包括为:

#include <codepart1.hpp>
#include "codepart1folder/codepart1.hpp"
基本上,这会将所有源代码转储到一个目录中,然后使用“mkdir build&&cd build&&cmake..&&在项目根文件夹中创建

如果项目中有单独的libs,那么您可能需要一个单独的libs目录,其中包含特定lib的另一个子文件夹

如果你想查看CMakeLists.txt文件,我有一些回购协议

我的项目结构存在的主要问题是,我使用了FILE_GLOB,这显然是一种“错误”的方式(如果在运行“cmake..”后添加文件,那么在执行“make”时,它们将不会被拾取)。我还没有弄清楚什么是“正确”的方法(从我所看到的情况来看,它包括保留一个单独的文件列表),我也只使用了1个CMakeLists.txt文件


一些项目还选择将其cpp和hpp文件分离到单独的目录中。因此,您将有一个include和src文件夹(至少对于打算在外部使用的hpp文件)。我认为这主要是针对大型图书馆的项目。也会使安装头文件更容易。

您可能会丢失头文件

include_directories(${PROJECT_SOURCE_DIR}/libfolder/codepart1folder)
在这种情况下,您可能希望将所有文件夹添加到include directory path变量中

检查命令行上cmake的输出是否设置了正确的include文件夹。此外,您可以始终使用
message()
作为cmake变量的“打印调试”。 但是,在包含目录的情况下,您需要读取目录属性以查看包含目录中的实际内容

get_property(inc_dirs DIRECTORY PROPERTY INCLUDE_DIRECTORIES)
message("inc_dirs = ${inc_dirs}")
我希望这能帮助你找出遗漏了什么

编辑

我刚刚在libfolder中看到您关于添加codepart1folder的评论。它仅在libfolder的include_目录路径中可用,不会传播到根文件夹。
由于lib.hpp中存在include codepart1.hpp,但是您需要在项目路径中也提供它,否则您在构建项目时会出现缺少声明的错误。

好的,因此在咨询了我的一位同事(他是CMake专家)后,似乎CMake不支持我正在尝试的操作,给其中一个留下3个选项:

  • 将所有依赖项添加到父项目CMakeLists.txt中-不是很干净,但它会让事情正常进行。您必须为每个添加代码的项目执行此操作,如果库发生更改,则返回并修复

  • 清理库标题。这是通过一些编译器黑客来完成的。其思想是向前声明每个类,只使用指针或boost::shared_ptr,然后只在cpp文件中包含依赖项。通过这种方式,您可以使用所有findpackage内容构建cpp文件,并且您还可以通过只包含头并链接到库来使用库

  • 研究构建系统。拥有可移植代码和具有复杂依赖关系的快速代码编译并不是一个已解决的问题!从我的调查结果来看,情况相当复杂。我最终采用了我的同事构建的系统,这个系统是他在cmake中自己创建的,使用的是他从谷歌那里学到的东西


  • 也许对cmake per see不是很有帮助,但我建议您看看premake。它已经接近成熟,并且对cmake有很多好处(其中之一是它的速度要快得多,特别是如果你已经了解lua的话)。您可以在上查看它。那么,是要使您的新项目能够使用以前生成的库,还是要从sortof元项目生成这两个库?codepart1folder包含在libfolder中的CMakeLists.txt文件中。在我看来,必须在项目文件夹的CmakeLists.txt中添加所有子文件夹、include和链接是错误的,因为project.cpp不依赖于它们中的任何一个,只有lib.hpp依赖于它们。在您的树中,假设有一个project2定义了一个库,我想使用project2作为project的子部分。@JohnSavage。但这是正确的方法。。。我将在LIB项目中创建一个LIB_INCLUDE_DIRS变量,该变量将“导出”到包含所有必需的依赖INCLUDE dir的CMakeCache。然后假设在创建项目时变量会出现。好的。。。fro
    get_property(inc_dirs DIRECTORY PROPERTY INCLUDE_DIRECTORIES)
    message("inc_dirs = ${inc_dirs}")