CMake可以找到boost库,但是Make在链接时失败了。

3

一个月后回到项目,我成功地运行了CMake,并得到了以下输出结果:

-- Boost version: 1.61.0
-- Found the following Boost libraries:
--   system
--   thread
--   filesystem
--   chrono
--   date_time
--   atomic
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/LittleNewt/gitness/MangaMeCLI/build

但是由于某种原因,当对生成的 MakeFile 运行 Make 命令时,会得到以下输出。
[ 50%] Building CXX object CMakeFiles/mangaMeCLI.dir/src/mangaMeCLI.cpp.o
[100%] Linking CXX executable mangaMeCLI
Undefined symbols for architecture x86_64:
  "boost::filesystem::path::operator/=(char const*)", referenced from:
      _main in mangaMeCLI.cpp.o
  "boost::filesystem::path::operator/=(boost::filesystem::path const&)", referenced from:
      boost::filesystem::path::operator/=(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&) in mangaMeCLI.cpp.o
      boost::filesystem::path::operator/=(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in mangaMeCLI.cpp.o
  "boost::filesystem::detail::current_path(boost::system::error_code*)", referenced from:
      boost::filesystem::current_path() in mangaMeCLI.cpp.o
  "boost::filesystem::detail::create_directory(boost::filesystem::path const&, boost::system::error_code*)", referenced from:
      boost::filesystem::create_directory(boost::filesystem::path const&) in mangaMeCLI.cpp.o
  "boost::filesystem::detail::status(boost::filesystem::path const&, boost::system::error_code*)", referenced from:
      boost::filesystem::exists(boost::filesystem::path const&) in mangaMeCLI.cpp.o
      boost::filesystem::is_directory(boost::filesystem::path const&) in mangaMeCLI.cpp.o
  "boost::system::system_category()", referenced from:
      ___cxx_global_var_init.75 in mangaMeCLI.cpp.o
  "boost::system::generic_category()", referenced from:
      ___cxx_global_var_init.73 in mangaMeCLI.cpp.o
      ___cxx_global_var_init.74 in mangaMeCLI.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [mangaMeCLI] Error 1
make[1]: *** [CMakeFiles/mangaMeCLI.dir/all] Error 2
make: *** [all] Error 2

我做了一些研究,发现其他人也因为没有链接正确版本的库(64位与32位)而遇到了相同的问题,但我不确定如何确定这是否是我的问题所在。

这是我的未更改的CMakeLists.txt文件:

CMAKE_MINIMUM_REQUIRED(VERSION 3.4.1)
PROJECT(MangaMeCLI)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
INCLUDE_DIRECTORIES(includes)
ADD_EXECUTABLE(mangaMeCLI src/mangaMeCLI.cpp)
MESSAGE("${CMAKE_CXX_FLAGS}")

SET(Boost_USE_MULTITHREADED ON)
FIND_PACKAGE(Boost REQUIRED COMPONENTS system thread filesystem)
INCLUDE_DIRECTORIES(${BOOST_INCLUDE_DIRS})
TARGET_LINK_LIBRARIES(mangaMeCLI ${BOOST_LIBRARIES})

SET(OPENSSL_ROOT_DIR /usr/local/Cellar/openssl/*)
FIND_PACKAGE(OpenSSL REQUIRED)
INCLUDE_DIRECTORIES(${OPENSSL_INCLUDE_DIR})
TARGET_LINK_LIBRARIES(mangaMeCLI ${OPENSSL_LIBRARIES})

FIND_PACKAGE(cppnetlib REQUIRED)
INCLUDE_DIRECTORIES(${CPPNETLIB_INCLUDE_DIRS})
TARGET_LINK_LIBRARIES(mangaMeCLI ${CPPNETLIB_LIBRARIES})

阅读了一条有用的评论后,我发现 BOOST_LIBRARIES 变量为空,尽管cmake打印出它找到了我要寻找的boost库。我认为这就是我错误的原因。


...(64位 vs 32位),但是我不确定如何确认这是否是我的问题。CMake找到的库存储在BOOST_LIBRARIES变量中。您可以添加message(${BOOST_LIBRARIES})行来输出此变量的值(在cmake阶段),并检查库。 - Tsyvarev
此外,您可以在调用 find_package(Boost...) 之前尝试使用 set(Boost_DEBUG ON) 来启用 FindBoost 的调试输出。 - piwi
打开调试后,我发现了多次出现的 NO_DEFAULT_PATH;NO_CMAKE_FIND_ROOT_PATH。谢谢帮助,我会查看一下并确定这是否是导致我的错误的原因。 编辑:经过调查,似乎没问题,因为我没有指定根路径。 - Jem4687
1个回答

1
CMake变量区分大小写。根据查找模块的文档,您需要使用Boost_LIBRARIES而不是BOOST_LIBRARIES
INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS})
TARGET_LINK_LIBRARIES(mangaMeCLI ${Boost_LIBRARIES})

那个可行了,可能是由于较新的cmake版本中有一个更改,因为大写的BOOST以前可以正常工作,您是否建议我将其他find_packages更改为与软件包名称的拼写相匹配,例如OpenSSL_INCLUDE_DIRS? - Jem4687
2
@Jem4687 是的,CMake正在朝着统一使用查找模块名称确切大小写的变量名的方向发展。当然,如果您可以并且如果该模块支持它们,最好使用带有使用要求的导入目标(然后您不必关心包含目录等)。根据我链接的文档,Boost支持它们。 - Angew is no longer proud of SO

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接