如何在共享对象构建中包含子目录

Posted

技术标签:

【中文标题】如何在共享对象构建中包含子目录【英文标题】:How to include subdirectories in shared object build 【发布时间】:2016-09-15 16:43:33 【问题描述】:

我已经重新组织了我的项目,我想知道如何在我的共享对象的构建中包含来自子目录的源代码。我现在有以下目录结构:

src/
    Component/
        CMakeLists.txt
        SubComponent1/
            src1.h
            src1.cpp
        SubComponent2/
            src2.h
            src2.cpp

我的 CMakeLists.txt 目前看起来像:

add_library(MainProject SHARED src1.cpp src2.cpp)

我现在如何更新它以构建下面的文件夹?我还需要将 CMakeLists.txt 添加到 SubComponentX 文件夹吗?

谢谢

【问题讨论】:

C 和 C++ 的标签添加有 what,究竟与这个问题有什么关系? 如果您需要将子目录中的文件编译到主库中,只需将此文件添加到您的add_library()调用中。如果要构建其他库,请在主 CMakeLists.txt 或子目录中使用 additional add_library() 调用。那么,有什么问题呢? @WhozCraig,因为它用于构建 C 和 C++ 应用程序。这也是 C 和 C++ 开发人员所拥有的经验,因此我可以获得对我的问题有用的答案,巧合的是,您的评论不属于“有用”类别。 @jdie8274j 不会争论你的意图。这两个标签都用于关于这些语言的问题,包括相同的代码(通常标签描述会说明这一点;例如:将鼠标悬停在 C++ 标签上)。这是我问的唯一原因。如果您认为将更广泛的网络投放到不相关的标签上,希望能找到一些“有用”的东西,那就太好了。很高兴您找到了答案。 【参考方案1】:

如果您仍希望将源代码嵌入到单个库中,只需更改项目中的路径即可:

add_library(MainProject SHARED
    SubComponent1/src1.cpp
    SubComponent2/src2.cpp
)

如果您希望每个子目录单独构建,您可以在src/Component/CMakeLists.txt 中使用add_subdirectory

add_subdirectory(SubComponent1)
add_subdirectory(SubComponent2)

在这种情况下,您确实需要src/Component/SubComponent1,2 中的 CMakeLists 文件来声明子库:

add_library(SubComponent1 SHARED src1.cpp)

# ...

target_link_libraries(MainProject SubComponent1)

注意,你可以声明object libraries分开编译,同时避免最后出现多个库文件:

add_library(SubComponent1 OBJECT src1.cpp)

# ...

add_library(MainProject $<TARGET_OBJECTS:SubComponent1> ...)

【讨论】:

以上是关于如何在共享对象构建中包含子目录的主要内容,如果未能解决你的问题,请参考以下文章

如何在构建时将其他文件包含到 C# 的输出目录中?

如何在不将目录包含到彼此编译命令中的情况下构建目标?

Diagnostic Log and Trace——开发人员如何使用 DLT

Roslaunch 无法打开共享对象文件:没有这样的文件或目录

加载共享库时出错,无法打开共享对象文件:没有这样的文件或目录(hiredis)

clang:加载共享库时出错:libtinfo.so.5:无法打开共享对象文件:没有这样的文件或目录