3

我在使用 cmake 2.8.1 的 Linux 环境中使用 CMake。我还尝试了 cmake 2.8.7,结果相同。

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

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

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

这是2个源文件:

主.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)

首先,我创建档案 mylib。使用 add_custom_command 我进行条件处理, add_custom_target 为条件存档提供顶级目标。由于我需要在构建条件存档之前更新输入存档,因此我在输入存档顶级目标和条件存档顶级目标之间添加了依赖关系。这完美!当我触摸 mylib.c 并运行 make conditions 时,会构建输入存档,然后是条件存档。

好的。现在我使用条件存档进行链接。为了使可执行文件依赖于条件存档,我再次使用了 add_dependencies。但是触摸库源 mylib.c 然后运行 ​​make 不会按预期更新可执行文件。

CMakeLists.txt 中的错误在哪里?

4

1 回答 1

2

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

...
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)
于 2013-01-21T10:01:16.043 回答