cmake 要区分include_directories和add_subdirectory吗?

oknwwptz  于 2022-11-11  发布在  其他
关注(0)|答案(2)|浏览(303)

我正在学习用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?为什么不需要这个额外的文件,当所述目录的内容是根级别的?

m0rkklqb

m0rkklqb1#

add_subdirectory(source_dir):用于将子目录添加到生成中。source_dir中也有一个CMakeLists.txt文件。CMake将立即处理指定源目录中的此CMakeLists.txt文件,然后在当前输入文件中继续处理此命令以外的内容。
include_directories(dir):将给定目录添加到编译器用于搜索包含文件的目录中。这些目录将添加到当前CMakeLists文件的目录属性INCLUDE_DIRECTORIES中。

tzxcd3kk

tzxcd3kk2#

include_directories()用于添加标题搜索路径(-I标志),add_subdirectory()在这种情况下没有区别。
我想,你需要在add_executable()add_library()调用中列出gen-cpp文件夹中的 *.cpp文件,你希望这些符号在其中。
或者,您可以将所有thrift源代码编译到库中,并将其与您的代码链接。

相关问题