dla*_*nts 9 c++ makefile compilation cmake
我一直在努力解决这个问题,而我与cmake的冒险只会产生一些我非常肯定不正确的黑客解决方案.
我创建了一个包含多个文件的库,如下所示:
-libfolder
-codepart1folder
-CMakeLists.txt
-codepart1.cpp
-codepart1.hpp
-codepart2folder
-codepart3folder
-lib.cpp
-lib.hpp
-CMakeLists.txt
Run Code Online (Sandbox Code Playgroud)
我写了一个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)
Run Code Online (Sandbox Code Playgroud)
当我运行make时,库编译得很好,但是当project.cpp编译时,它会抱怨它找不到codepart1.hpp(它包含在lib.hpp中,包含在project.cpp中).
我怀疑这是做错的方法,但我不能浏览CMake文档并找到一个关于设置这样的项目的好教程.请帮助,CMake大师!
将一个CMake项目导入另一个CMake项目的简洁方法是通过find_package命令.包声明是使用export命令完成的.使用find_package的一个优点是它不需要硬编码包文件的路径.
关于缺少的hpp文件,您没有包含codepart1文件夹,因此它不在include路径中.
好吧,在咨询了我的一位 CMake 大师同事后,CMake 似乎不支持我想要做的事情,留下了 3 个选项:
将所有依赖项添加到父项目 CMakeLists.txt - 不是很干净,但它会让事情正常工作。您必须为添加代码的每个项目执行此操作,并在库发生更改时返回并修复问题。
清理你的库头。这是通过一些编译器黑客技术完成的。这个想法是前向声明每个类,并仅使用指针或 boost::shared_ptr,然后仅在 cpp 文件中包含依赖项。这样,您就可以使用所有 findpackage 内容构建 cpp 文件,并且只需包含标头并链接到库即可使用 lib。
研究构建系统。拥有可移植的代码和具有复杂依赖关系的快速代码编译并不是一个已解决的问题!根据我的调查,事情相当复杂。我最终采用了我的同事构建系统,该系统是他在 cmake 中自己创建的,使用的是他从 Google 获取的东西。