首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用CMake包含NTL

如何使用CMake包含NTL
EN

Stack Overflow用户
提问于 2012-05-08 07:23:37
回答 2查看 1.6K关注 0票数 1

我使用下面这行代码来编译一个简单的程序:

代码语言:javascript
复制
g++ main.cc -lntl -lm -lgmp 

如何将其包含到CMake中?

代码语言:javascript
复制
find_package(NTL REQUIRED)
find_package(GMP REQUIRED)

不起作用。并给出以下错误:

代码语言:javascript
复制
CMake Error at CMakeLists.txt:30 (find_package):
  Could not find module FindNTL.cmake or a configuration file for package
  NTL.
...
.

代码语言:javascript
复制
SET(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -std=c++0x -lntl -lm -lgmp)

也不能工作(但我认为这在总体上是错误的)。

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2012-05-08 08:52:32

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

代码语言:javascript
复制
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调用,例如

代码语言:javascript
复制
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命令更改为

代码语言:javascript
复制
target_link_libraries(test ${NTL_LIB} ${M_LIB} ${GMP_LIB})

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

注意,用引号将额外的CXX_FLAGS参数括起来很重要,否则CMake会将它们视为列表中的单独值,并在标志之间插入分号。

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

代码语言:javascript
复制
cmake --help-command find_library
cmake --help-command find_file
票数 4
EN

Stack Overflow用户

发布于 2012-05-08 07:56:01

关于你的错误:

看起来CMake中并没有包含FindNTL.cmake模块。这意味着你必须选择:

  • 写你自己的FindNTL.cmake
  • 找到另一个别人写的链接,
  • 一起破解一个解决方案:
    • 检查NTL是否是链接目标,相关标志,等等。

从(相当快速的)谷歌搜索中,似乎有人拥有an NTL module for CMake。因为NTL使用GMP,所以你可能需要the associated GMP module for CMake。它看起来不像一个功能齐全的CMake模块,但它似乎也是最好的(同样,它是一个快速的谷歌搜索,我不使用NTL)。

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

代码语言:javascript
复制
# 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)

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

是的,这是错误的。你不想用链接指令来设置你的CXX_FLAGS。我将使用:

代码语言:javascript
复制
SET ( CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -std=cxx0x )

要设置要使用的Cxx标准,请执行以下操作。要实际链接到库,您需要执行以下操作:

  • 确保您已经找到了库(带有相关的find_package ( FOO )行)
  • 将这些库链接到您的目标上,如下所示:构建Foo可执行文件。(或者库,或者其他任何东西) 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}。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10490474

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档