【问题标题】:cmake try_compile: Using library found in configurecmake try_compile:使用在配置中找到的库
【发布时间】:2021-02-21 00:38:04
【问题描述】:

我正在使用 cmake 构建一个项目。项目使用外部库plplot;我已经为库和头文件配置了 cmake,并且缓存在变量${PLPLOT_LIBRARY}, ${PLPLOT_LIB_PATH} and ${PLPLOT_INCLUDE_PATH} 中。在 plplot 库中,一个函数已更改名称:plwid -> plwidth,我想检测到这一点。我写了一个小try_compile()测试:

try_compile(HAVE_PLWID ${CMAKE_BINARY_DIR} cmake/tests/test_plwid.c)

但是这个测试总是会失败,因为我必须将标头和库信息传递给try_compile 进程。像这样手动调用gcc

gcc -I${PLPLOT_INCLUDE_PATH} cmake/tests/test_plwid.c -L${PLPLOT_LIB_PATH} -l${PLPLOT_LIBRARY}

有效。但是我不明白如何将必要的标志传递给try_compilecommand:我试过了:

 try_compile(HAVE_PLWID ${CMAKE_BINARY_DIR} cmake/tests/test_plwid.c
             INCLUDE_DIRECTORIES ${PLPLOT_INCLUDE_PATH}
             LINK_DIRECTORIES ${PLPLOT_LIB_PATH}
             LINK_LIBRARIES ${PLPLOT_LIBRARY})

然后我得到 cmake 配置错误:

Attempt at a recursive or nested TRY_COMPILE in directory

    /path/to/build

我非常确信${PLPLOT_XXX} 变量是正确的,至少构建的其余部分基于这些变量可以正常工作。

更新:如果我使用--debug_trycompile 命令调用cmake,然后转到build/CMakeFiles/CMakeTmp 目录并手动调用cmakethere:

cmake . -DINCLUDE_DIRECTORIES=/path/plplot/include -DLINK_DIRECTORIES=/path/to/plplot/lib -DLINK_LIBRARIES=plplotd

测试程序将正确构建和链接;所以似乎挑战是将这些选项正确传递给try_compile()cmake 命令调用?

【问题讨论】:

    标签: cmake


    【解决方案1】:

    LINK_DIRECTORIESINCLUDE_DIRECTORIES 不能作为选项传递给 try_compile,但必须通过 CMAKE_FLAGS 选项以下列方式作为额外标志传递:

    try_compile(HAVE_PLWID "${CMAKE_BINARY_DIR}/temp" "${CMAKE_SOURCE_DIR}/tests/test_plwid.c"
                 LINK_LIBRARIES ${PLPLOT_LIBRARY}
                 CMAKE_FLAGS 
                      "-DINCLUDE_DIRECTORIES=${PLPLOT_INCLUDE_PATH}"
                      "-DLINK_DIRECTORIES=${PLPLOT_LIB_PATH}")
    

    【讨论】:

    • 感谢您的回答 - 不幸的是,这会导致 cmake 配置错误:“尝试在目录 /path/to/build 中递归或嵌套 TRY_COMPILE”。实际的 try_compile() 命令位于子目录中 - 如果这很重要?
    • 尝试为try_comile 使用不同的二进制目录。查看更新的答案。
    • 嗯 - 仍然没有雪茄。不,我收到 cmake 配置错误:“CMake 错误:“源目录 /path/to/cmake/tests/test_plwid.c”是文件而不是目录。
    • 尝试使用相对于CMAKE_SOURCE_DIR 的路径来编译要编译的文件,并在二进制目录中添加引号。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-29
    • 1970-01-01
    • 2012-09-06
    • 1970-01-01
    • 1970-01-01
    • 2015-10-04
    相关资源
    最近更新 更多