我正在用 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命令调用?
该LINK_DIRECTORIES和INCLUDE_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)
| 归档时间: |
|
| 查看次数: |
2811 次 |
| 最近记录: |