我正在尝试正确管理目标在外部构建的库上的依赖关系,不知怎的,我没有成功。我已经阅读了大量的教程,帖子和例子,但是,因为我是CMake的新手,我想我错过了一些显而易见的事情。
设置如下。用另一种(CMake不支持的)语言构建的外部库产生libadatest.a。我已经使用了ExternalProject_Add。然后,有另一个使用此lib的常规C目标。一切正常,但如果我更改原始库,即使我重新编译它,C目标也不会重新编译。这是一个完整的样本。我正在使用CMake 2.8.12:
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)时,正确地进行了外部重新编译,但主要可执行文件没有重新链接。很明显,库的时间戳比使用它的可执行文件更新鲜。
编辑:我也试过这个而不是自定义目标,结果相同:
add_library(AdaTest
UNKNOWN IMPORTED
IMPORTED_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/libadatest.a)
答案 0 :(得分:3)
在这篇旧帖子中找到了正确的解决方案(正如预期的那样简单):https://css-tricks.com/image-under-text/
要点是使用target_link_libraries中的实际文件,因此检查其时间戳。因此不需要中间或自定义依赖项:
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})