2013-06-01 24 views
2

我试图在使用CMake的构建环境中包含外部库。我不是试图在本地系统上安装它(事实上,我宁愿不是这样做,我不希望/usr/local堵塞各种类型的库);我只想得到结果libxml2.a可用于链接我的可执行文件。我可以用的CMakeLists.txt以下罚款构建它:CMake构建和链接到库,而不安装到/ usr/local或其他地方

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)如何将我的build输出目录下获得所产生的库(即libxml2.a)?

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

我试着用

ADD_LIBRARY(xml2 STATIC libxml2.a) 

一个繁琐的解决方案,但它好像有必须大于牵引整个库的内容转换成...图书馆更好的办法。

谢谢。

回答

1

您需要更清楚地了解CMake发生了什么。现在只能看到它有一些自定义命令,它会每次运行。与使用COMMAND的add_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的看到上依赖的东西,它会运行命令(如果没有按库已不存在)。

+0

谢谢。我无法完全理解我所从事的工作,现在我正尝试一种完全不同的方法,因此我无法将其作为“答案”进行测试。不过,为了欣赏而投票赞成。 – wilsonmichaelpatrick