28

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

包含目录(“根路径”/gen-cpp)。(连同相关的节俭自动生成和包括。

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

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

4

2 回答 2

15

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

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

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

于 2012-10-06T17:26:54.027 回答
15

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

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

于 2019-07-16T20:29:21.407 回答