2013-01-20 13 views
3

我在使用cmake 2.8.1的linux环境中使用CMake。我也试过cmake 2.8.7,结果相同。CMake:如何设置从可执行文件到自定义目标的依赖关系

我需要对存档(静态库)进行一些特殊的调整。这是作为cmake custom_command完成的。结果是应该在可执行文件的链接中使用新的存档。用于调节的输入档案也是一个cmake目标。

我需要的是存档的条件版本和可执行文件之间的依赖关系。使用add_dependencies不起作用,我不明白为什么。

我创建了一个示例,显示cmake的行为。该示例包含2个C文件,一个用于存档,另一个包含main()。作为简单的归档条件,我只是复制以前生成的归档。

这里有2个源文件:

的main.c:

int myPrint(void); 

int main(void) 
{ 
    myPrint(); 
} 

mylib.c:

#include <stdio.h> 

int myPrint(void) 
{ 
    printf("Hello World\n"); 
} 

这是我创建的的CMakeLists.txt:

cmake_minimum_required(VERSION 2.8) 

project(cmake_dependency_test) 

add_library(mylib STATIC mylib.c) 

add_custom_command(OUTPUT libmylib_conditioned.a 
        COMMAND cp libmylib.a libmylib_conditioned.a 
        DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/libmylib.a 
        COMMENT "Conditioning library") 
add_custom_target(conditioning DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/libmylib_conditioned.a) 
add_dependencies(conditioning mylib) 

add_executable(cmake_dependency_test main.c) 
add_dependencies(cmake_dependency_test conditioning) 
target_link_libraries(cmake_dependency_test -L. mylib_conditioned) 

首先我创建archi ve mylib。通过add_custom_command我可以进行条件处理,add_custom_target为条件归档文件提供顶级目标。由于我需要在创建条件归档之前更新输入归档,因此我在输入归档顶级目标和条件归档顶级目标之间添加了依赖关系。这完美的作品!当我触摸mylib.c并运行make conditioning时,会创建输入存档并在此之后调整存档。

好的。现在我使用条件归档进行链接。为了有一个从可执行文件到条件归档文件的依赖关系,我再次使用了add_dependencies。但是触摸库源mylib.c然后运行make将不会按预期更新可执行文件。

CMakeLists.txt中的错误在哪里?

回答

2

您可以尝试为目标设置目标属性LINK_DEPENDS cmake_dependency_test

... 
add_executable(cmake_dependency_test main.c) 
set_property(TARGET cmake_dependency_test PROPERTY LINK_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/libmylib_conditioned.a) 
add_dependencies(cmake_dependency_test conditioning mylib) 
target_link_libraries(cmake_dependency_test -L. mylib_conditioned) 
+0

这可能是依赖的替代方案。不适合我的是custom_command中可执行的依赖项。 – user1995197

+0

我编辑了答案。我在Windows上测试过它,但我希望它适合您。 – guini

相关问题