如何“add_dependencies(..)”到“未知的导入”库?

时间:2018-02-04 14:38:50

标签: cmake

我想在项目中使用获取googletest的{​​{3}}。但似乎有些不对劲:

ninja: error: 'libsuper/test/googletest-prefix/src/googletest-build/googlemock/gtest/libgtest.a', needed by 'libdsuper/test/libsuper_test', missing and no known rule to make it

据我了解错误,当忍者试图构建测试可执行文件时,没有可用的gtest库。因此,我在测试目标之后添加了一个依赖项:

add_executable(${PROJECT_NAME}_test ${SOURCES})
add_dependencies(${PROJECT_NAME}_test ${GTEST_LIBRARY})

但这没有效果。它的接缝就像它被默默地忽略了一样。我想这是因为IMPORTED适用于不需要编译的系统库,因此从一开始就可以使用。就我而言,这不是真的。 googletest库仅在ExternalProject_Add编译后才可用。

这是否也与ninja相关联?上面链接的网站没有提到问题 - 我可以想象这是因为googletestlibSomeOtherThingThatUsesGTest按顺序构建,正如make所做的那样。

如何指示cmake等到gtest库真正可用?

2 个答案:

答案 0 :(得分:2)

依赖 IMPORTED 库目标有一点意义 - 没有操作与这样的目标绑定,所以实际上你什么都不依赖。

相反,您应该依赖目标,这会创建库。对于外部项目,这是为此类项目创建的目标(while (pa2 < &frase[size]) { ++pa2; *pa1 = *pa2; pa1++; } frase.resize(size - 1 - (pa2 - pa1)); cout << "La frase dopo l'eliminazione è: " << frase << '\n'; 函数调用的第一个参数)。

如果正常(非 IMPORTED )库目标情况完全不同:创建此类库的操作与目标本身绑定,因此依赖于库目标意味着库应该是在dependee之前建造。但很少使用这种依赖:相反,一个链接与库目标,这本身就暗示了与该目标绑定的动作的依赖。

答案 1 :(得分:0)

对于googletest你应该使用:

add_executable(${PROJECT_NAME}_test ${SOURCES})
target_link_directories(${PROJECT_NAME}_test gtest)

将自动管理依赖关系。 此外,导入的目标gtest已根据this

依赖于googletest ExternalProject_Add

我猜错误来自于导入的目标文件位置${binary_dir}/googlemock/gtest/${CMAKE_FIND_LIBRARY_PREFIXES}gtest.a的路径错误恕我直言。