【发布时间】:2015-08-16 17:49:56
【问题描述】:
我在 Mac OS X 上,使用以下 CMake 文件,并在 /usr/local/lib/boost_1_58_0 上安装了 Boost v1.58.0,每次运行 cmake 时都会打印“找不到 Boost”。我已经阅读了所有关于如何使它工作的堆栈溢出帖子,但没有任何效果。有什么我只是想念的吗?
cmake_minimum_required (VERSION 3.1)
project (HelloWorld)
set (CMAKE_CXX_FLAGS "--std=gnu++11 ${CMAKE_C_FLAGS}")
file (GLOB SOURCE_FILES "source/*.cpp")
set (CMAKE_INCLUDE_PATH ${CMAKE_INCLUDE_PATH} /usr/local/lib/boost_1_58_0/boost)
set (CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} /usr/local/lib/boost_1_58_0/stage/lib)
set (Boost_NO_BOOST_CMAKE ON)
set (BOOST_NO_SYSTEM_PATHS ON)
set (BOOST_ROOT /usr/local/lib/boost_1_58_0)
set (BOOST_INCLUDEDIR /usr/local/lib/boost_1_58_0/boost)
set (BOOST_LIBRARYDIR /usr/local/lib/boost_1_58_0/stage/lib)
set (Boost_USE_STATIC_LIBS OFF)
set (Boost_USE_MULTITHREADED ON)
set (Boost_USE_STATIC_RUNTIME OFF)
find_package (Boost 1.58.0 COMPONENTS optional)
if (Boost_FOUND)
include_directories (${Boost_INCLUDE_DIRS})
target_link_libraries (helloworld ${Boost_LIBRARIES})
endif ()
include_directories ("source")
add_executable (helloworld ${SOURCE_FILES})
【问题讨论】:
-
想通了。 optional 实际上不是一个库,因为它只是标题。
-
风格和可移植性点:您不应该在 CMakeLists.txt 中定义任何特定于系统的内容,例如 BOOST_ROOT、BOOST_INCLUDEDIR 和 BOOST_LIBRARYDIR。如果您确实需要设置这些,请在命令行上使用 -D 进行设置。整个第一个 boost 节可以省略,对于 include 和 library path set 命令也是如此——单独使用 include_directories(${Boost_INCLUDE_DIRS})。
-
附加可移植性注释:您使用 --std=gnu++11 但 CMake 提供编译功能以将任何受支持的编译器置于适当的模式。另外,不要将 C 标志附加到 CXX 标志上。此外,target_link_libraries 应该真正出现在 add_executable 之后,因为此时目标不存在。
-
关于 MacOS X 上 Boost 的最后说明:您尝试过自制软件吗?我使用它来提供 Boost 和许多其他用于开发的库。它开箱即用,无需特殊设置。如果它能让您的生活更轻松,我们是否值得一看。
-
感谢您的提示。真的是第一次用cmake,感觉要拔牙了。