如何使用 CMake 包含 NTL

how to include NTL using CMake

本文关键字:NTL 包含 CMake 何使用      更新时间:2023-10-16

我用这一行来编译一个简单的程序:

g++ main.cc -lntl -lm -lgmp 

您如何将其包含在CMake中?

find_package(NTL REQUIRED)
find_package(GMP REQUIRED)

不行。并给出以下错误:

CMake Error at CMakeLists.txt:30 (find_package):
  Could not find module FindNTL.cmake or a configuration file for package
  NTL.
...
.

SET(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -std=c++0x -lntl -lm -lgmp)

也不起作用(但我认为这通常是错误的(。

谢谢!

如果ntlmgmp库通常安装到默认路径中的某个位置(例如 /usr//usr/local/(,您可以简单地执行以下操作:

cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
project(Test)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
add_executable(test main.cc)
target_link_libraries(test ntl m gmp)


这可能最接近您的原始 g++ 命令,但它不是很健壮;如果找不到任何库,则在尝试链接之前不会知道它。 如果要在配置时失败(即在运行 CMake 时(,可以为每个必需的库添加find_library调用,例如

find_library(NTL_LIB ntl)
if(NOT NTL_LIB)
  message(FATAL_ERROR "ntl library not found.  Rerun cmake with -DCMAKE_PREFIX_PATH="<path to lib1>;<path to lib2>"")
endif()

然后,您必须将target_link_libraries命令更改为

target_link_libraries(test ${NTL_LIB} ${M_LIB} ${GMP_LIB})

然后,您可能还必须对每个 lib 的一个头文件进行find_file,以找出通过 include_directories 命令(转换为 g++ 的 -I(添加的适当路径。


请注意,在额外的CXX_FLAGS参数两边加上引号很重要,否则 CMake 将它们视为列表中的单独值,并在标志之间插入分号。


有关find_libraryfind_file等的更多信息,请运行:

cmake --help-command find_library
cmake --help-command find_file

关于你的错误:

看起来 CMake 中不包含FindNTL.cmake模块。这意味着您必须:

  • 写你自己的FindNTL.cmake
  • 找一个别人写的,
  • 将解决方案组合在一起:
    • 检查是否安装了 NTL
    • 提供链接目标、相关标志等。

从(相当快的(谷歌搜索中,似乎有人有一个用于CMake的NTL模块。由于 NTL 使用 GMP,因此您可能需要与 CMake 相关的 GMP 模块。它看起来不像一个功能齐全的CMake模块,但它似乎也是最好的东西(同样,这是一个快速的谷歌搜索,我不使用NTL(。

要使用,您需要在CMakeLists.txt中添加一些内容:

# Let CMake know where you've put the FindNTL.cmake module. 
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/build/CMake/Modules")
# Call the FindNTL module:
find_package(NTL REQUIRED)

SET(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -std=c++0x -lntl -lm -lgmp(

是的,这是错误的。您不希望使用链接指令设置CXX_FLAGS。我会使用:

SET ( CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -std=cxx0x )

以设置要使用的 Cxx 标准。要实际链接到库,您需要:

  • 确保您已找到库(带有相关的find_package ( FOO )行(
  • 将它们与您的目标链接起来,如下所示:

    # Build the Foo executable. (Or library, or whatever)
    add_executable (FooEXE ${Foo_SOURCES} )
    target_link_libraries (FooEXE
        ${bar_LIBRARIES}
        ${baz_LIBRARY}
        )
    

    请注意! ${bar_LIBRARIES}${baz_LIBRARY}不是错别字;在FindFOO.cmake模块中设置相关库没有标准方法,在我看来,这很烦人。如果一个不起作用,请尝试另一个,或者,最坏的情况,查看相关的FindFOO.cmake文件(默认情况下安装了一堆 CMake(,看看每个文件都使用了什么。通过我提供的链接,您可以使用 ${NTL_LIB} 和 ${GMP_LIB}。