cmake try_compile:使用在配置中找到的库

use*_*005 1 cmake

我正在用 cmake 构建一个项目。项目使用外部库plplot;我已将 cmake 配置为库和标头,并将其缓存在 variables 中${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)
Run Code Online (Sandbox Code Playgroud)

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

gcc -I${PLPLOT_INCLUDE_PATH} cmake/tests/test_plwid.c -L${PLPLOT_LIB_PATH} -l${PLPLOT_LIBRARY}
Run Code Online (Sandbox Code Playgroud)

作品。但是我不明白如何将必要的标志传递给try_compile命令:我试过:

 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})
Run Code Online (Sandbox Code Playgroud)

然后我得到了 cmake 配置错误:

Attempt at a recursive or nested TRY_COMPILE in directory

    /path/to/build
Run Code Online (Sandbox Code Playgroud)

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

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

cmake . -DINCLUDE_DIRECTORIES=/path/plplot/include -DLINK_DIRECTORIES=/path/to/plplot/lib -DLINK_LIBRARIES=plplotd
Run Code Online (Sandbox Code Playgroud)

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

sak*_*kra 7

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}")
Run Code Online (Sandbox Code Playgroud)