不安装到 /usr/local 或其他位置,使用 CMake 构建并链接库

3

我正在尝试在使用CMake的构建环境中包含一个外部库。我不想在本地系统上安装它(事实上,我更不想这样做,我不想让/usr/local被各种各样的库所占据);我只想将生成的libxml2.a用于与我的可执行文件链接。我可以通过在CMakeLists.txt中添加以下内容来成功构建它:

set (LIBXML_PATH ${MY_SOURCE_DIR}/libxml2-2.9.1)
add_custom_target (build_libxml ALL
    COMMENT "Building libxml"
    COMMAND ./configure --prefix=/tmp
    COMMAND make
    WORKING_DIRECTORY ${LIBXML_PATH}
)

但我仍然遇到以下问题:

1)对于将使用configuremake构建的库放入CMake环境中的一般目的,这是否是正确的方法?

2)如何将生成的库(即libxml2.a)放置在我的build输出目录下?

3)如何为我的可执行文件构建链接到该库?

我尝试了一种繁琐的解决方案,使用了

ADD_LIBRARY( xml2 STATIC libxml2.a )

但是看起来应该有比将整个图书馆的内容都搬到另一个图书馆中更好的方法。

谢谢。

1个回答

0

你需要让CMake更清楚地知道这里发生了什么。现在它只能看到你有一些自定义命令,每次都会运行它。与使用COMMANDadd_custom_target不同,我发现使用add_custom_command更好。

像这样:

set (LIBXML_PATH ${MY_SOURCE_DIR}/libxml2-2.9.1)
add_custom_command(
    OUTPUT libxml2.a
    COMMENT "Building libxml"
    COMMAND ./configure --prefix=/tmp
    COMMAND make
    WORKING_DIRECTORY ${LIBXML_PATH}
)
target_link_libraries(your-program libxml2.a)

通过这种方式,CMake 可以理解您的自定义命令的基本产品是 libxml2.a,当 CMake 看到依赖于它的东西时,它将运行该命令(如果库不存在)。

谢谢。我无法将其与我正在处理的内容完全融合在一起,现在我正在尝试完全不同的方法,因此无法将其作为“答案”进行测试。但还是感谢您的赞赏。 - user2088639

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接