我用这一行来编译一个简单的程序:
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)
也不起作用(但我认为这通常是错误的(。
谢谢!
如果ntl
、m
和gmp
库通常安装到默认路径中的某个位置(例如 /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_library
、find_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}。