# NOTE: This is just an example. I'm not familiar with Webkit.
# NOTE: The library must add packaging support for this to work nicely!
# https://cmake.org/cmake/help/latest/guide/importing-exporting/index.html
find_package(WebKit CONFIG)
# Ready to use libraries
target_link_libraries(foobar PRIVATE WebKit::foobar)
2条答案
按热度按时间fcg9iug31#
我认为在WebKit中使用
CMAKE_SOURCE_DIR
是一个bug。他们应该使用PROJECT_SOURCE_DIR
。请参阅Fraser对more details的回答。您可以尝试在 checkout 后、运行CMake之前修补WebKit的代码。
另外,你可以开一个问题来要求开发者改进,或者更好的方法是创建一个pull request。
gfttwv5a2#
有没有更好的方法来将更大更复杂的项目包含在父cmake项目中?我希望有一种方法可以更好地封装子项目,这样这些问题就不会再出现了。
注:这个问题有点开放式,所以我会在这里漫谈一下。
你可以像上面指出的那样修补Webkit的代码。这是一个很好的/有效的建议。但是它确实让我认为Webkit设计了他们的项目通过
package manager
安装和使用。他们没有考虑项目被add_subdirectory
使用。通常当我在流行的项目中看到CMAKE_SOURCE_DIR
时,情况就是这样。这是一个库的选择。不是所有的库都被设计为通过
add_subdirectory
使用。事实上,相当多的库只打算是installed
,然后是found
。这取决于库维护人员来决定他们想要支持什么。我个人认为,使用大型复杂项目的最佳方式是使用像
vcpkg
、conan
等包管理器。它使得处理像
boost
这样的更大的依赖关系变得非常棒。这对你的项目来说是绝对关键的。注意事项:我对vcpkg有一点偏爱,因为我对它有贡献,并使它在使用boost,openssl等的封闭源代码生产环境中工作。
它会一次性构建你的依赖项。然后你就可以用
find_package
找到它们。更好的是它提供了二进制缓存。当你有大量的依赖项时,这对构建性能来说是非常棒的(特别是在没有ccache的Windows上)。包管理器的好处是,一般来说,它使您不必太关心您正在吸收的CMake代码的质量。
字符串
包管理器透明地为您处理所有这些。
既然你只关心已安装的文件(公共头文件、库文件等),那么你所需要的就是:
型
你已经准备好出发了。
像vcpkg这样的工具更好的一点是,它可以很好地处理不支持CMake的项目。
例如,Make仍然很受欢迎。
它将在幕后执行以下操作
型
在这种情况下,您可以通过CMake的其他
find
功能找到所需的文件。型
add_subdirectory
有它的优点(易于使用)和缺点(难以处理大项目)find_package
有它的优点(性能/更干净的CMake代码)和缺点(需要包管理器,更多的初始设置,需要学习另一个工具)这取决于你的项目,但就我个人而言,我一直喜欢使用包管理器来提高构建性能。
注意:如果需要的话,你也可以将两种方法合并结合起来。天空是极限。每个人都有自己的情况。
第二个注意事项:还有其他的解决方案,如FetchContent和CPM。我已经使用过它们,目前仍然喜欢vcpkg。