更改静态库的包含路径

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 &lt;engine.hpp&gt;

【讨论】:

但这不是我想要的。我仍然希望用户将我的库名称放在包含的开头。

以上是关于更改静态库的包含路径的主要内容,如果未能解决你的问题,请参考以下文章

linux中,包含静态库的动态库导出时,静态库的函数也被一并导出

Autotools 指定静态库的安装路径

markdown Linux的下动态库路径配置,静态库,动态库的制作与使用

如何创建包含静态库的 pod?

在 xcode 4.x 中添加静态库的标头搜索路径混淆?

静态库和动态库的生成和编译