如何在共享对象构建中包含子目录
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> ...)
【讨论】:
以上是关于如何在共享对象构建中包含子目录的主要内容,如果未能解决你的问题,请参考以下文章
Diagnostic Log and Trace——开发人员如何使用 DLT
Roslaunch 无法打开共享对象文件:没有这样的文件或目录