我正在学习用CMake来编译C++代码,并努力学习以下概念。在我的根目录下,我有一些cpp文件和一个CMakeLists.txt文件,它成功地在gen-cpp目录下生成了一些thrift代码。我的根目录下的CMakeLists.txt文件包含:
include_directories(“到根的路径”/gen-cpp).(沿着相关的thrift自动生成和include。
一切编译正常,但我得到运行时动态库链接的错误,未定义的符号引用了一个类定义在gen-cpp目录。当我移动目录中的文件到根级别,它运行良好。我错过了什么?(我也调整了#包括在根级别cpp目录指向“路径到根”/gen-cpp)。
这是否是对include_directory的误解,我应该使用add_subdirectory。如果是后者,gen-cpp中的代码是否需要自己的CMakeLists.txt?为什么不需要这个额外的文件,当所述目录的内容是根级别的?
2条答案
按热度按时间m0rkklqb1#
add_subdirectory(source_dir)
:用于将子目录添加到生成中。source_dir中也有一个CMakeLists.txt文件。CMake将立即处理指定源目录中的此CMakeLists.txt文件,然后在当前输入文件中继续处理此命令以外的内容。include_directories(dir)
:将给定目录添加到编译器用于搜索包含文件的目录中。这些目录将添加到当前CMakeLists文件的目录属性INCLUDE_DIRECTORIES中。tzxcd3kk2#
include_directories()
用于添加标题搜索路径(-I
标志),add_subdirectory()
在这种情况下没有区别。我想,你需要在
add_executable()
或add_library()
调用中列出gen-cpp文件夹中的 *.cpp文件,你希望这些符号在其中。或者,您可以将所有thrift源代码编译到库中,并将其与您的代码链接。