无法将boost库与CMake链接 我有一个C++代码,使用Boost(程序选项模块),如下所示: #include <iostream> #include <boost/program_options/options_description.hpp> #include <boost/program_options/parsers.hpp> #include <boost/program_options/variables_map.hpp> namespace po = boost::program_options; int main(int argc, const char* argv[]){ po::options_description description("MyTool Usage"); description.add_options() ("help,h", "Display this help message") ("version,v", "Display the version number"); po::positional_options_description p; po::variables_map vm; po::store(po::command_line_parser(argc, argv).options(description).positional(p).run(), vm); po::notify(vm); if(vm.count("help")){ std::cout << description; return 0; } if(vm.count("version")){ std::cout << "MyTool Version 1.0" << std::endl; return 0; } return 0; } cmake_minimum_required(VERSION 2.6) set(CMAKE_CXX_LINK_FLAGS "-std=c++11 -g -Wall -fsigned-char -lboost_program_options-mt") set(BOOST_ROOT /opt/local/include/boost) set(BOOST_LIBRARYDIR /opt/local/lib) find_package(Boost COMPONENTS program_options system filesystem REQUIRED) include_directories(${BOOST_INCLUDE_DIR}) link_libraries(${BOOST_LIBRARIES}) add_executable(testboostpo testboostpo_simple.cpp) target_link_libraries(testboostpo ${Boost_LIBRARIES})

无法将boost库与CMake链接 我有一个C++代码,使用Boost(程序选项模块),如下所示: #include <iostream> #include <boost/program_options/options_description.hpp> #include <boost/program_options/parsers.hpp> #include <boost/program_options/variables_map.hpp> namespace po = boost::program_options; int main(int argc, const char* argv[]){ po::options_description description("MyTool Usage"); description.add_options() ("help,h", "Display this help message") ("version,v", "Display the version number"); po::positional_options_description p; po::variables_map vm; po::store(po::command_line_parser(argc, argv).options(description).positional(p).run(), vm); po::notify(vm); if(vm.count("help")){ std::cout << description; return 0; } if(vm.count("version")){ std::cout << "MyTool Version 1.0" << std::endl; return 0; } return 0; } cmake_minimum_required(VERSION 2.6) set(CMAKE_CXX_LINK_FLAGS "-std=c++11 -g -Wall -fsigned-char -lboost_program_options-mt") set(BOOST_ROOT /opt/local/include/boost) set(BOOST_LIBRARYDIR /opt/local/lib) find_package(Boost COMPONENTS program_options system filesystem REQUIRED) include_directories(${BOOST_INCLUDE_DIR}) link_libraries(${BOOST_LIBRARIES}) add_executable(testboostpo testboostpo_simple.cpp) target_link_libraries(testboostpo ${Boost_LIBRARIES}),c++,c++11,gcc,boost,cmake,C++,C++11,Gcc,Boost,Cmake,尽管cmake.似乎成功了,而且它还检测到我通常使用的所有boost模块(程序选项、系统、文件系统) 下一步make失败,出现以下错误: $make 链接boost库以获取程序选项似乎有问题。但是,我可以看到库安装在/opt/local/lib/libboost\u program\u options-mt.dylib 或者,我也尝试隔离编译,但也失败了 $ g++ -L/opt/local/lib testboostpo_simple.cpp -lboost_program_options-m

尽管
cmake.
似乎成功了,而且它还检测到我通常使用的所有boost模块(程序选项、系统、文件系统)

下一步
make
失败,出现以下错误: $make

链接boost库以获取程序选项似乎有问题。但是,我可以看到库安装在
/opt/local/lib/libboost\u program\u options-mt.dylib

或者,我也尝试隔离编译,但也失败了

$ g++ -L/opt/local/lib testboostpo_simple.cpp -lboost_program_options-mt
Undefined symbols for architecture x86_64:
  "boost::program_options::to_internal(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)", referenced from:
      std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > boost::program_options::to_internal<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&) in ccg8tggM.o
  ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status

$ g++ -L/opt/local/lib testboostpo_simple.cpp /opt/local/lib/libboost_program_options-mt.dylib
Undefined symbols for architecture x86_64:
  "boost::program_options::to_internal(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)", referenced from:
      std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > boost::program_options::to_internal<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&) in ccg8tggM.o
  ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
$g++-L/opt/local/lib testboostpo\u simple.cpp-lboost\u program\u options-mt
架构x86_64的未定义符号:
“boost::program_options::to_internal(std::_cx11::basic_string const&)”,引用自:
ccg8tggM.o中的std::vector boost::program_options::to_internal(std::vector const&)
ld:找不到架构x86_64的符号
collect2:错误:ld返回了1个退出状态
$g++-L/opt/local/lib testboostpo_simple.cpp/opt/local/lib/libboost_program_options-mt.dylib
架构x86_64的未定义符号:
“boost::program_options::to_internal(std::_cx11::basic_string const&)”,引用自:
ccg8tggM.o中的std::vector boost::program_options::to_internal(std::vector const&)
ld:找不到架构x86_64的符号
collect2:错误:ld返回了1个退出状态
我使用的是gcc5、boost 1.66和cmake 3.12(它们都是使用macports安装的)。 boost头文件位于以下位置:
/opt/local/include/boost/
boost库文件位于以下位置:
/opt/local/lib

这里有人知道是什么原因导致尽管提供了路径,boost链接仍然失败吗?这里还有什么遗漏或错误指定的吗


谢谢,

看起来您正在尝试将32位库链接到64位版本。提示为:未找到架构x86\u 64的ld:symbol

链接库需要与确切的生成类型匹配。以下是有关链接过程的更多信息


因为您已经使用了CMAKE_CXX_LINK_标志,CMAKE将首先检查它,而不是使用您的目标链接库,如果您想自己完成,还需要添加-L/opt/local/lib,更简单的方法是让CMAKE为您完成。以下是我的例子:

cmake_minimum_required(VERSION 2.6)
project(server CXX)
set(CXX_FLAGS
-g
-Wall
)

# set(Boost_NO_SYSTEM_PATHS ON)
set(BOOST_ROOT /mnt/d/Code/boost)
set(BOOST_LIBRARYDIR /mnt/d/Code/boost/stage/lib)
find_package(Threads REQUIRED)
find_package(Boost 1.68.0 COMPONENTS program_options REQUIRED)
file(GLOB SRC 
 "*cpp*"
 )
if(Boost_FOUND)
  include_directories(${Boost_INCLUDE_DIRS})
  message(${Boost_PROGRAM_OPTIONS_LIBRARIES})
  add_executable(main ${SRC})
  target_link_libraries(main Threads::Threads ${Boost_PROGRAM_OPTIONS_LIBRARIES})
endif()

此外,如果单独构建,应该首先编译对象,然后链接,否则它可能会变成未定义的引用。在您的情况下,您应该在最后链接,当您将链接放在前面或后面时,结果会有所不同,很抱歉,我不知道为什么会发生这种情况。

看起来我确实在使用64位库。你觉得怎么样<代码>$file/opt/local/lib/libboost_filesystem-mt.dylib-->提供输出-->/opt/local/lib/libboost_filesystem-mt.dylib:Mach-O通用二进制文件,具有两种体系结构:[i386:Mach-O动态链接共享库i386][x86_64:Mach-O 64位动态链接共享库x86_64]/opt/local/lib/libboost_filesystem-mt.dylib(适用于架构i386):Mach-O动态链接共享库i386谢谢。正如我上面所示,我也尝试了以下两个命令,但都失败了:$g++-L/opt/local/lib testboostpo\u simple.cpp-lboost\u program\u options-mt和$g++-L/opt/local/lib testboostpo\u simple.cpp/opt/local/libboost\u program\u options-mt.dylibI刚刚尝试使用您的CMakeLists.txt文件。它仍然失败,出现相同的错误。您对这里可能出现的其他问题有什么想法吗?我的示例仅供您参考。$g++testboostpo_simple.cpp-L/opt/local/lib/opt/lib/libboost_程序_options-mt.dylib应该可以工作。此外,更改配置后,请删除CMakeCache.txt创建一个新的。谢谢,是的,这个命令应该可以工作,但它不工作。我有一个脚本可以清理CMakeFiles/*、CMakeCache.txt和cmake_install.cmake。我每次运行cmake之前都会运行它。所以我认为这不是问题。它似乎因为不同的原因而失败。
$ g++ -L/opt/local/lib testboostpo_simple.cpp -lboost_program_options-mt
Undefined symbols for architecture x86_64:
  "boost::program_options::to_internal(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)", referenced from:
      std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > boost::program_options::to_internal<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&) in ccg8tggM.o
  ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status

$ g++ -L/opt/local/lib testboostpo_simple.cpp /opt/local/lib/libboost_program_options-mt.dylib
Undefined symbols for architecture x86_64:
  "boost::program_options::to_internal(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)", referenced from:
      std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > boost::program_options::to_internal<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&) in ccg8tggM.o
  ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
cmake_minimum_required(VERSION 2.6)
project(server CXX)
set(CXX_FLAGS
-g
-Wall
)

# set(Boost_NO_SYSTEM_PATHS ON)
set(BOOST_ROOT /mnt/d/Code/boost)
set(BOOST_LIBRARYDIR /mnt/d/Code/boost/stage/lib)
find_package(Threads REQUIRED)
find_package(Boost 1.68.0 COMPONENTS program_options REQUIRED)
file(GLOB SRC 
 "*cpp*"
 )
if(Boost_FOUND)
  include_directories(${Boost_INCLUDE_DIRS})
  message(${Boost_PROGRAM_OPTIONS_LIBRARIES})
  add_executable(main ${SRC})
  target_link_libraries(main Threads::Threads ${Boost_PROGRAM_OPTIONS_LIBRARIES})
endif()