CMAKE顶级项目有两个依赖项目,一个孩子也取决于另一个孩子

发布于 2025-02-07 20:08:14 字数 647 浏览 4 评论 0 原文

我的项目在顶部。

项目A要求库B和图书馆C。

库B也需要库C本身。

因此,简而言之。如何通过链接B将库b和c链接到A? 我现在可以通过单独链接所有图书馆来工作,但是我觉得我可以摆脱冗余。

这是Project A顶部的CMAKE的一部分:

find_package(libB REQUIRED)
include_directories(${libB_INCLUDE_DIR})
target_link_libraries(${PROJECT_NAME} ${libB_LIBRARY})

find_package(libC REQUIRED)
include_directories(${libC_INCLUDE_DIR})
target_link_libraries(${PROJECT_NAME} ${libC_LIBRARY})

但是在Libb中,我在其CMAKE中有一个:

find_package(libC REQUIRED)
include_directories(${libC_INCLUDE_DIR})
target_link_libraries(${PROJECT_NAME} ${libC_LIBRARY})

我觉得有一种更好的方法可以做到这一点,请告诉我。谢谢您的任何帮助。

I have Project A at the top.

Project A requires library B and library C.

Library B also requires library C by itself.

So, in short. How can I link libraries B and C up to A by just linking B?
I have it working now by individually linking all the libraries, but I feel like there is redundancy I could get rid of.

This is part of the CMAKE for Project A at the top:

find_package(libB REQUIRED)
include_directories(${libB_INCLUDE_DIR})
target_link_libraries(${PROJECT_NAME} ${libB_LIBRARY})

find_package(libC REQUIRED)
include_directories(${libC_INCLUDE_DIR})
target_link_libraries(${PROJECT_NAME} ${libC_LIBRARY})

But also within libB I have this in its CMAKE:

find_package(libC REQUIRED)
include_directories(${libC_INCLUDE_DIR})
target_link_libraries(${PROJECT_NAME} ${libC_LIBRARY})

I feel like there is a better way to do this, please let me know. Thank you for any help.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

无可置疑 2025-02-14 20:08:14

您可以使用 target_include_directories include_directories 为当前目录的所有目标指定它们。除其他外,这还使提供可见性指定的能力包括DIRS,其中控制您的包含DIRS是否仅影响当前目标( private ),只有那些目标链接到您的目标(接口)或两个( public )。 target_link_libraries 类似地使用了相同的指定符。

因此,您可以使用 public 避免复制您的lib c包含和库,并且由于它是默认的规范符,因此可以省略它。然后,您的一部分cmakelists可能看起来像这样:

在a a a a cmakelists.txt中:

find_package(libB REQUIRED)
target_include_directories(${PROJECT_NAME} ${libB_INCLUDE_DIR})
target_link_libraries(${PROJECT_NAME} ${libB_LIBRARY}) 

在lib b b cmakelists.txt中:

find_package(libC REQUIRED)
target_include_directories(${PROJECT_NAME} ${libC_INCLUDE_DIR})
target_link_libraries(${PROJECT_NAME} ${libC_LIBRARY})

如果您,例如,例如,只想lib b链接到lib c,但请留下公开的“继承”,包括目录,,包括目录,,,您可以更改lib b cmakelists的最后一行。txt摘录:

target_link_libraries(${PROJECT_NAME} PRIVATE ${libC_LIBRARY})

You can use target_include_directories (documentation) to specify include directories for your target instead of specifying them for all targets of the current directory using include_directories. Among other things, this gives the ability to provide visibility specifiers to your includes dirs, which control whether your include dirs will affect only current target (PRIVATE), only those targets which link to your target (INTERFACE) or both (PUBLIC). The same specifiers are used similarly for target_link_libraries.

So, you can use PUBLIC to avoid duplicating your lib C includes and libraries, and since it is the default specifier, you can omit it. Then, parts of your CMakeLists may look like this:

In project A CMakeLists.txt:

find_package(libB REQUIRED)
target_include_directories(${PROJECT_NAME} ${libB_INCLUDE_DIR})
target_link_libraries(${PROJECT_NAME} ${libB_LIBRARY}) 

In lib B CMakeLists.txt:

find_package(libC REQUIRED)
target_include_directories(${PROJECT_NAME} ${libC_INCLUDE_DIR})
target_link_libraries(${PROJECT_NAME} ${libC_LIBRARY})

If you, e.g., want only lib B to link to lib C, but leave public 'inheritance' of include directories, you could change the last line of lib B CMakeLists.txt excerpt:

target_link_libraries(${PROJECT_NAME} PRIVATE ${libC_LIBRARY})
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文