尽管找到了Boost库,但仍使用“未定义的引用”进行Cmake

v2g6jxz6  于 2022-11-11  发布在  其他
关注(0)|答案(2)|浏览(275)

cmake 2.8.12正确显示:

Boost version: 1.56.0
Found the following Boost libraries:
  system
  thread
  log
  log_setup

生成的link.txt显示了.so文件的完整、正确路径,但每个Boost调用都只是“在函数中...未定义对boost的引用...”,没有cxx11或ABI或任何其他提示。

CMakeFiles/proj.dir/src/proj.cc.o: In function `proj::init()':

/code/proj/src/proj.cc:31: undefined reference to `boost::log::v2s_mt_posix::core::get()'

这是在一个旧的机器上运行的,例如libc-2.13.so在32位处理器上使用www.example.com。昨天我在机器上编译了boost库,并试图在机器上编译这个库,但没有任何进展。我也在机器上编译了cmake。
在这里搜索了几十个问题,我一无所获。有什么建议吗?如何调查这个问题?

set(PROJ_NAME my-proj)

set(HEADERS
    headers/proj.h
)

set(SOURCES
    src/proj.cc
)

set(MAIN_FILE src/main.cc)

if(COMMAND cmake_policy)
   cmake_policy(SET CMP0003 NEW)
endif(COMMAND cmake_policy)

add_executable (${PROJ_NAME} ${SOURCES} 
${HEADERS} ${MAIN_FILE})

target_include_directories ( ${PROJ_NAME}
   PUBLIC headers
   PRIVATE .
   PRIVATE /usr/local/lib/
)

set( Boost_LIBRARY_DIR /usr/local/lib )
find_package(Boost COMPONENTS system thread log log_setup REQUIRED)
link_directories(${Boost_LIBRARY_DIR})

target_link_libraries ( ${PROJ_NAME} -pthread ${Boost_LIBRARIES} )
sbdsn5lh

sbdsn5lh1#

我认为

set( Boost_LIBRARY_DIR /usr/local/lib )

是错误的,会严重干扰Find_Package。如果要提供提示,请使用例如BOOST_ROOT,如下所示:

BOOST_ROOT=~/custom/boost cmake .

下面是一个经过修正/简化的自包含示例:

  • 文件CMakeLists.txt
set(PROJ_NAME my-proj)

 find_package(Boost 1.65.0 COMPONENTS system thread log log_setup REQUIRED)
 set(HEADERS
     headers/proj.h
 )

 set(SOURCES
     src/proj.cc
 )

 set(MAIN_FILE src/main.cc)

 if(COMMAND cmake_policy)
    cmake_policy(SET CMP0003 NEW)
 endif(COMMAND cmake_policy)

 add_executable (${PROJ_NAME} ${SOURCES} 
 ${HEADERS} ${MAIN_FILE})

 target_include_directories ( ${PROJ_NAME}
    PUBLIC headers
    PRIVATE .
    PRIVATE /usr/local/lib/
 )

 link_directories(${Boost_LIBRARY_DIR})

 target_link_libraries ( ${PROJ_NAME} -pthread ${Boost_LIBRARIES} )
  • 文件headers/proj.h
  • 文件src/main.cc
int main() {
 }
  • 文件src/proj.cc

# include <boost/thread.hpp>

 void foo() {
     boost::thread_group tg;
     tg.create_thread([]{});
     tg.join_all();
 }

布丁的证明:

cmake .
CMake Warning (dev) in CMakeLists.txt:
  No project() command is present.  The top-level CMakeLists.txt file must
  contain a literal, direct call to the project() command.  Add a line of
  code such as

    project(ProjectName)

  near the top of the file, but after cmake_minimum_required().

  CMake is pretending there is a "project(Project)" command on the first
  line.
This warning is for project developers.  Use -Wno-dev to suppress it.

-- The C compiler identification is GNU 7.5.0
-- The CXX compiler identification is GNU 7.5.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Looking for pthread.h
-- Looking for pthread.h - found
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Failed
-- Looking for pthread_create in pthreads
-- Looking for pthread_create in pthreads - not found
-- Looking for pthread_create in pthread
-- Looking for pthread_create in pthread - found
-- Found Threads: TRUE  
-- Found Boost: /usr/include (found suitable version "1.65.1", minimum required is "1.65.0") found components: system thread log log_setup chrono date_time atomic filesystem regex 
CMake Warning (dev) in CMakeLists.txt:
  No cmake_minimum_required command is present.  A line of code such as

    cmake_minimum_required(VERSION 3.22)

  should be added at the top of the file.  The version specified may be lower
  if you wish to support older CMake versions for this project.  For more
  information run "cmake --help-policy CMP0000".
This warning is for project developers.  Use -Wno-dev to suppress it.

-- Configuring done
-- Generating done
-- Build files have been written to: /tmp/q
 sehe  /  tmp  q  make
[ 66%] Building CXX object CMakeFiles/my-proj.dir/src/proj.o
[ 66%] Building CXX object CMakeFiles/my-proj.dir/src/main.o
[100%] Linking CXX executable my-proj
[100%] Built target my-proj
 sehe  /  tmp  q  ldd my-proj 
    linux-vdso.so.1 (0x00007ffd917e4000)
    libboost_system.so.1.65.1 => /usr/lib/x86_64-linux-gnu/libboost_system.so.1.65.1 (0x00007f40c25bd000)
    libboost_thread.so.1.65.1 => /usr/lib/x86_64-linux-gnu/libboost_thread.so.1.65.1 (0x00007f40c2398000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f40c2179000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f40c1d6c000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f40c1b54000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f40c1763000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f40c155b000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f40c29e7000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f40c11bd000)

注解

请注意,如果您使用的提升时间太晚,则依赖关系可能不正确:

CMake Warning at /usr/share/cmake-3.22/Modules/FindBoost.cmake:1369 (message):
  New Boost version may have incorrect or missing dependencies and imported
  targets
Call Stack (most recent call first):
  /usr/share/cmake-3.22/Modules/FindBoost.cmake:1492 (_Boost_COMPONENT_DEPENDENCIES)
  /usr/share/cmake-3.22/Modules/FindBoost.cmake:2102 (_Boost_MISSING_DEPENDENCIES)
  CMakeLists.txt:5 (find_package)

在我的系统上,例如,为了成功使用Boost 1.78,我必须手动添加Boost系统。链接器错误:

make
[ 33%] Building CXX object CMakeFiles/my-proj.dir/src/proj.o
[ 66%] Building CXX object CMakeFiles/my-proj.dir/src/main.o
[100%] Linking CXX executable my-proj
CMakeFiles/my-proj.dir/src/proj.o: In function `__static_initialization_and_destruction_0(int, int)':
proj.cc:(.text+0x6a1): undefined reference to `boost::system::generic_category()'
proj.cc:(.text+0x6ad): undefined reference to `boost::system::generic_category()'
proj.cc:(.text+0x6b9): undefined reference to `boost::system::system_category()'
CMakeFiles/my-proj.dir/src/proj.o: In function `boost::system::error_category::std_category::equivalent(int, std::error_condition const&) const':
proj.cc:(.text._ZNK5boost6system14error_category12std_category10equivalentEiRKSt15error_condition[_ZNK5boost6system14error_category12std_category10equivalentEiRKSt15error_condition]+0xb8): undefined reference to `boost::system::generic_category()'
proj.cc:(.text._ZNK5boost6system14error_category12std_category10equivalentEiRKSt15error_condition[_ZNK5boost6system14error_category12std_category10equivalentEiRKSt15error_condition]+0xf3): undefined reference to `boost::system::generic_category()'
CMakeFiles/my-proj.dir/src/proj.o: In function `boost::system::error_category::std_category::equivalent(std::error_code const&, int) const':
proj.cc:(.text._ZNK5boost6system14error_category12std_category10equivalentERKSt10error_codei[_ZNK5boost6system14error_category12std_category10equivalentERKSt10error_codei]+0xb8): undefined reference to `boost::system::generic_category()'
proj.cc:(.text._ZNK5boost6system14error_category12std_category10equivalentERKSt10error_codei[_ZNK5boost6system14error_category12std_category10equivalentERKSt10error_codei]+0xf3): undefined reference to `boost::system::generic_category()'
proj.cc:(.text._ZNK5boost6system14error_category12std_category10equivalentERKSt10error_codei[_ZNK5boost6system14error_category12std_category10equivalentERKSt10error_codei]+0x1d2): undefined reference to `boost::system::generic_category()'
CMakeFiles/my-proj.dir/src/proj.o:proj.cc:(.text._ZN5boost16thread_exceptionC2EiPKc[_ZN5boost16thread_exceptionC5EiPKc]+0x28): more undefined references to `boost::system::generic_category()' follow
collect2: error: ld returned 1 exit status
CMakeFiles/my-proj.dir/build.make:121: recipe for target 'my-proj' failed
make[2]:***[my-proj] Error 1
CMakeFiles/Makefile2:82: recipe for target 'CMakeFiles/my-proj.dir/all' failed
make[1]:***[CMakeFiles/my-proj.dir/all] Error 2
Makefile:90: recipe for target 'all' failed
make:***[all] Error 2

修复:

target_link_libraries ( ${PROJ_NAME} boost_system )
fdbelqdn

fdbelqdn2#

我希望现在在此作答还不算太晚。
TLDR:当Boost是使用软件包管理器(如Homebrew或macports)安装的时候,它通常是使用clang++编译的。但是在您的项目端,可能会使用不同的编译器,导致在链接阶段出现未定义的引用。
为了使用您希望在项目中使用的编译器,您必须使用使用相同编译器编译的Boost版本。要实现这一点,您可以在macos上自定义Boost编译,如下所示:
1.在Bootstrap阶段,用途:
./bootstrap.sh --prefix=/usr/local/Cellar/boost_gcc --with-toolset=gcc --without-libraries=python,mpi
1.按以下步骤安装仅限接头的部件:
./b2 headers
1.通过添加一个名为user-config.jam的文件(其中包含以下行),定制编译器以构建库:
using gcc : : /usr/local/bin/g++-11 ;
1.编译并安装程式库,如下所示:
./b2 -d2 -j12 --layout=tagged-1.66 --user-config=user-config.jam install threading=multi,single link=shared,static
我希望能有所帮助。

相关问题