首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >CMake依赖项:在更改外部库时强制重新编译

CMake依赖项:在更改外部库时强制重新编译
EN

Stack Overflow用户
提问于 2015-07-01 20:15:22
回答 1查看 2.1K关注 0票数 6

我试图正确地管理目标对外部构建的库的依赖,但不知何故我没有成功。我已经读了很多教程,帖子和例子,但是,由于我是CMake的新手,我想我遗漏了一些显而易见的东西。

设置如下。使用另一种(不支持CMake)语言构建的外部库生成libadatest.a。为此,我使用了ExternalProject_Add。然后,还有另一个使用这个库的常规C目标。一切正常,但如果我更改了原始库,即使我重新编译它,C目标也不会重新编译。这是一个完整的示例。我使用的是CMake 2.8.12:

代码语言:javascript
运行
复制
cmake_minimum_required(VERSION 2.8)    
include(ExternalProject)

ExternalProject_Add(
    AdaTestExternal # Not important
    SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}
    BUILD_COMMAND gprbuild -P${CMAKE_CURRENT_SOURCE_DIR}/adalibtest -XOBJ_DIR=${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY} -XLIB_DIR=${CMAKE_CURRENT_BINARY_DIR}
    ALWAYS 1    # Force build, gprbuild will take care of dependencies
    # BUILD_ALWAYS 1 # For 3.0 higher versions?
    INSTALL_COMMAND ""
)
add_custom_target(AdaTest DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/libadatest.a)
link_directories(${CMAKE_CURRENT_BINARY_DIR}) # Needed or won't find it

add_executable(main_ada main.c)
add_dependencies(main_ada AdaTest) # We must depend on the final output lib
target_link_libraries(main_ada adatest)

我尝试的是创建一个依赖于实际库的中间自定义目标,然后使主C目标依赖于这个目标。

当我删除外部构建的库(libadatest.a)时,它会正确地在外部重新编译,但主可执行文件不会重新链接。显而易见的是,库的时间戳比使用它的可执行文件更新。

我也尝试了这个方法,而不是自定义目标,结果也是一样的:

代码语言:javascript
运行
复制
add_library(AdaTest
    UNKNOWN IMPORTED
    IMPORTED_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/libadatest.a)
EN

Stack Overflow用户

发布于 2015-07-01 21:54:02

在这篇老帖子中找到了正确的解决方案(正如预期的那样,很简单):http://www.cmake.org/pipermail/cmake/2010-November/041072.html

要点是使用target_link_libraries中的实际文件,因此会检查它的时间戳。因此,不需要中间或自定义依赖项:

代码语言:javascript
运行
复制
set(AdaTestLib ${CMAKE_CURRENT_BINARY_DIR}/libadatest.a)

add_executable(main_ada main.c)
add_dependencies(main_ada AdaTestExternal)
target_link_libraries(main_ada ${AdaTestLib})
票数 4
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31161036

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档