【问题标题】:CMake Difference between include_directories and add_subdirectory?CMake include_directories 和 add_subdirectory 之间的区别?
【发布时间】:2012-09-27 12:35:23
【问题描述】:

我正在学习 CMake 以构建 C++ 代码,并在以下概念中苦苦挣扎。在我的根目录中,我有一些 cpp 文件和一个 CMakeLists.txt,它成功地在 gen-cpp 目录中生成了一些节俭代码。我的根级 CMakeLists.txt 包含:

include_directories("路径到根目录"/gen-cpp)。 (以及相关的节俭自动生成和包含。

一切编译正常,但我得到运行时动态库链接错误,因为未定义符号引用了 gen-cpp 目录中定义的类。当我将目录中的文件移动到根级别时,它运行良好。我错过了什么? (我还调整了根级 cpp 目录中的 #include 以指向“path-to-root”/gen-cpp)。

这是对使用include_directory的误解,我应该使用add_subdirectory。如果是后者,gen-cpp 中的代码是否需要自己的 CMakeLists.txt?当所述目录的内容是根级别时,为什么不需要这个附加文件?

【问题讨论】:

    标签: c++ cmake thrift


    【解决方案1】:

    include_directories() 用于添加标题搜索路径(-I 标志),add_subdirectory() 在这种情况下没有任何区别。

    我想,您需要在 add_executable()add_library() 调用中列出 gen-cpp 文件夹中的 *.cpp 文件,您希望这些符号包含在其中。

    或者,您可以将所有 thrift 源代码编译到库中并将其与您的代码链接。

    【讨论】:

    • 要详细说明你的最后一点,这听起来是处理这个问题的理想方法,是否有一个使用 CMake 宏的示例,用于自动生成/编译/链接某人的节俭代码可以指点我吗?
    • 我觉得我的问题还没有完全正确解释,我相信这在于我对 Cmake 的一般理解,而不是专门为了节俭。通用问题给出了一个顶级目录结构,其中包含一个 CMakeLists.txt、一些 .cpp/.h 文件和一个包含顶级目录 #include--- 中的附加 .cpp/.h 文件的目录我应该在根级 CMakeLists.txt 中查看命令以正确编译/链接内部目录中的文件吗?我是否还需要在内部目录中添加一个额外的 CMakeLists.txt,如果需要包含什么?
    • 不,你不需要它。只需在 add_*() 调用中列出这些文件:add_executable(myexe file1.cpp folder/file2.cpp)
    • 在这种情况下include_directories和add_subdirectory一样,在这种情况下是不同的。如果有人可以请举个例子。
    【解决方案2】:

    add_subdirectory(source_dir) 用于将子目录添加到构建中。 source_dir 中还有一个 CMakeLists.txt 文件。指定源目录中的这个 CMakeLists.txt 文件将由 CMake 立即处理,然后在当前输入文件中的处理继续超出此命令。

    include_directories(dir) :将给定目录添加到编译器用于搜索包含文件的目录中。这些目录被添加到当前 CMakeLists 文件的目录属性 INCLUDE_DIRECTORIES 中。

    【讨论】:

      猜你喜欢
      • 2015-11-05
      • 2019-10-27
      • 1970-01-01
      • 1970-01-01
      • 2013-11-17
      • 1970-01-01
      • 1970-01-01
      • 2011-05-03
      • 2018-07-08
      相关资源
      最近更新 更多