在 cmake 中,PRIVATE、PUBLIC、INTERFACE 是用来指定目标之间的依赖关系的关键字,它们可以用在 target_link_libraries、target_include_directories、target_compile_definitions 等指令中,用来控制依赖项的传递和范围。以下是一些示例和解释:
【target_link_libraries示例】
target_link_libraries(libA PRIVATE libB)
这样,libA 就可以链接到 libB,但是如果有一个可执行文件 app,它依赖于 libA,那么它不会自动链接到 libB,也不能使用 libB 的功能。如果你想让 app 也链接到 libB,你需要显式地写出:
target_link_libraries(app libA libB)
target_link_libraries(libA INTERFACE libB)
这样,libA 就不会链接到 libB,但是如果有一个可执行文件 app,它依赖于 libA,那么它会自动链接到 libB,并且可以使用 libB 的功能。这种情况通常发生在当前目标只是作为一个接口或者包装器,将另一个目标的功能暴露给其他目标。
target_link_libraries(libA PUBLIC libB)
这样,libA 就会链接到 libB,并且如果有一个可执行文件 app,它依赖于 libA,那么它也会自动链接到 libB,并且可以使用 libB 的功能。这种情况通常发生在当前目标既使用了另一个目标的功能,也将其暴露给其他目标。
【target_include_directories示例】
用于指定目标包含的头文件路径。PRIVATE、PUBLIC 和 INTERFACE,分别表示不同的作用域和传递方式。
target_include_directories(hello-world PRIVATE hello)
这样,其他依赖 libhello-world.so 的目标(比如一个可执行文件)就不会自动包含 hello.h。
target_include_directories(hello-world PUBLIC hello)
这样,其他依赖 libhello-world.so 的目标就会自动包含 hello.h。
target_include_directories(hello-world INTERFACE hello)
这样,其他依赖 libhello-world.so 的目标就会自动包含 hello.h,但是 libhello-world.so 本身不会。
一些示例:
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- igat.cn 版权所有 赣ICP备2024042791号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务