更改静态库的包含路径
Posted
技术标签:
【中文标题】更改静态库的包含路径【英文标题】:Change include path of static library 【发布时间】:2015-03-10 11:16:02 【问题描述】:我想从我的一个项目中制作一个静态库,这样我就可以在其他项目中像这样使用它:
#include <MonoEngine/engine.hpp>
但是现在我在两者之间有一个 src 文件夹:
#include <MonoEngine/src/engine.hpp>
如何使用 CMake 构建静态库,以便可以省略 src/
?
这就是我的库文件夹的大致结构。
monoEngine
|-src
| |-engine.hpp
| |-engine.cpp
| |-subfolder1
| |-file.hpp
| |-file.cpp
|-CMakeLists.txt
【问题讨论】:
【参考方案1】:创建子文件夹 include
并将所有标题放在其中并将该文件夹添加到包含路径:
monoEngine
|-include
| |-MonoEngine
| | |-engine.hpp
| | |-subfolder1
| | |-public.hpp
|-src
| |-engine.cpp
| |-subfolder1
| |-private.hpp (will not be shared with third parties)
| |-file.cpp
|-CMakeLists.txt
这样include
中的标头将提供您库的公共接口,而src
-目录中的标头不会暴露给使用您的库的第三方。这是构建库的常用方法。
附录:
由于您在下面的 cmets 中询问如何将其与 CMake 一起使用,因此一个简单的 CMakeLists.txt 可能如下所示(未经测试):
project( your_project )
cmake_minimum_required( VERSION 3.0 )
set( SRC_LIST
include/MonoEngine/engine.hpp
include/MonoEngine/subfolder1/public.hpp
src/engine.cpp
src/subfolder1/file.cpp
src/subfolder1/private.h )
add_library( your_lib $SRC_LIST )
target_include_directories( your_lib PUBLIC $CMAKE_SOURCE_DIR/include $CMAKE_SOURCE_DIR/src )
# and then optional parameters:
# target_compile_options( your_lib ... )
# target_link_libraries( your_lib ... )
# install(TARGETS your_lib ... )
【讨论】:
你能解释一下我必须添加到我的 CMakeLists.txt 中的内容吗?之前我只有add_definitions( -I$PROJECT_SOURCE_DIR/src )
我在上面的回答中添加了 CMake 的示例项目文件。
我在使用 ExternalProject 时仍然遇到问题,不过我会提出一个不同的问题,因为它超出了范围。【参考方案2】:
cmake 有一个 include_directories 命令,它允许您将目录添加到编译器将查找的包含文件的列表中,更多详细信息请参见 documentation
如果您修改了构建系统,您应该可以在源代码中写入#include <engine.hpp>
。
【讨论】:
但这不是我想要的。我仍然希望用户将我的库名称放在包含的开头。以上是关于更改静态库的包含路径的主要内容,如果未能解决你的问题,请参考以下文章
linux中,包含静态库的动态库导出时,静态库的函数也被一并导出