Boost не может связать? - PullRequest
       25

Boost не может связать?

0 голосов
/ 23 января 2019

Заранее большое спасибо за чтение этого длинного поста!Я пытаюсь настроить проект CMake для работы с Boost и Catch2, но boost не может установить связь с определенной папкой.Для короткой версии просто перейдите к Проблема .Я объясню настройку, а затем проблему.

Настройка:

libstdc++.so.6 (libc6,x86-64) => /lib64/libstdc++.so.6
libstdc++.so.6 (libc6) => /lib/libstdc++.so.6
Red Hat Enterprise Linux Server release 7.6 (Maipo)
gcc (GCC) 8.2.1 20180905 (Red Hat 8.2.1-3)

(установлена ​​из devtoolset 8, стандартная система: gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-36)) IВ настоящее время я пытаюсь настроить систему сборки cmake.К сожалению, на текущей машине разработки буст уже был установлен, так что мой буст находится на

BOOST_INCLUDE_DIR=/opt/boost/boost_1_69_0/boost/ 
BOOST_LIB_DIR=/opt/boost/current/stage/release/lib/

Когда я смотрю на /opt/boost/boost_1_69_0/boost/, я вижу, что есть правильная версия #define BOOST_LIB_VERSION "1_69" Также библиотеки, которые я знаю, что ониверсии 1_69 из-за их скомпилированного имени libboost_math_tr1f-gcc8-mt-x64-1_69.so.1.69.0

К сожалению, в системе уже установлено повышение, поэтому /usr/include/boost/version.hpp содержит #define BOOST_LIB_VERSION "1_53"

Это мое текущее дерево

├── bin
│   ├── debug
│   │   └── libtest_utility.a
│   └── release
│       └── libtest_utility.a
├── build
│   ├── debug
│   └── release
├── CMakeLists.txt
├── include
│   └── test_utility.h
├── src
│   ├── exmaple.cpp
│   └── test_utility.cpp
└── test
    ├── bin
    │   ├── debug
    │   └── release
    ├── build
    │   ├── debug
    │   └── release
    ├── CMakeLists.txt
    └── src
        ├── main2.cpp
        └── main.cpp

и это мои 2 файла Cmake:

cmake_minimum_required(VERSION 3.13)

set (NAME "test_utility")

set (TestUtility_VERSION_MAJOR 0)
set (TestUtility_VERSION_MINOR 1)
set (TestUtility_VERSION_PATCH 0)
set (TestUtility_VERSION_STRING ${TestUtility_VERSION_MAJOR}.${TestUtility_VERSION_MINOR}.${TestUtility_VERSION_PATCH})

project(TestUtility  
        VERSION ${TestUtility_VERSION_STRING}
        DESCRIPTION "Testing the library target utility in Cmake"
        LANGUAGES CXX)

set (DEV_ROOT $ENV{DEV_ROOT})
set (BOOST_INCLUDE_DIR $ENV{BOOST_INCLUDE_DIR})
set (BOOST_LIB_DIR $ENV{BOOST_LIB_DIR})

set (PROJECT_SOURCES "${DEV_ROOT}/${NAME}/src/test_utility.cpp"
                     "${DEV_ROOT}/${NAME}/include/test_utility.h"  )


add_library (${NAME} STATIC ${PROJECT_SOURCES})

target_include_directories (${NAME} PUBLIC  "${DEV_ROOT}/${NAME}/include"
                                    PRIVATE "${BOOST_INCLUDE_DIR}")
target_link_directories (${NAME} PRIVATE ${BOOST_LIB_DIR})
target_link_options(${NAME} PRIVATE "-Wl --verbose")

if(CMAKE_BUILD_TYPE MATCHES DEBUG)
  target_link_libraries(${NAME}  libboost_regex-gcc8-mt-d-x64-1_69.a)
ELSEIF(CMAKE_BUILD_TYPE MATCHES RELEASE)
  target_link_libraries(${NAME}  libboost_regex.a)
ENDIF()

set_target_properties(${NAME} PROPERTIES VERSION ${TestUtility_VERSION_STRING}
                                         CXX_STANDARD 17
                                         CXX_STANDARD_REQUIRED ON
                                         ARCHIVE_OUTPUT_DIRECTORY_DEBUG  "${DEV_ROOT}/${NAME}/bin/debug"
                                         ARCHIVE_OUTPUT_DIRECTORY_RELEASE "${DEV_ROOT}/${NAME}/bin/release")

Тестовый файл Cmake:

cmake_minimum_required(VERSION 3.13)

set (NAME "test_utility")
set (TEST_NAME "test_${NAME}")


set (TestUtility_VERSION_MAJOR 0)
set (TestUtility_VERSION_MINOR 1)
set (TestUtility_VERSION_PATCH 0)
set (TestUtility_VERSION_STRING ${TestUtility_VERSION_MAJOR}.${TestUtility_VERSION_MINOR}.${TestUtility_VERSION_PATCH})


project(Test_TestUtility  
        VERSION ${TestUtility_VERSION_STRING}
        DESCRIPTION "Testing the library target utility in Cmake"
        LANGUAGES CXX)


set (DEV_ROOT $ENV{DEV_ROOT})
set (BOOST_INCLUDE_DIR $ENV{BOOST_INCLUDE_DIR})
set (BOOST_LIB_DIR $ENV{BOOST_LIB_DIR})
set (CATCH_INCLUDE_DIR $ENV{CATCH_INCLUDE_DIR})


set (PROJECT_SOURCES "${DEV_ROOT}/${NAME}/test/src/main.cpp"
                     "${DEV_ROOT}/${NAME}/src/test_utility.cpp"
                     "${DEV_ROOT}/${NAME}/include/test_utility.h"  )

add_executable (${TEST_NAME} ${PROJECT_SOURCES})

target_include_directories (${TEST_NAME} PUBLIC  "${DEV_ROOT}/${NAME}/include"
                                    PRIVATE "${BOOST_INCLUDE_DIR}"
                                    PRIVATE "${CATCH_INCLUDE_DIR}") 
target_link_directories (${TEST_NAME} PRIVATE ${BOOST_LIB_DIR})

if(CMAKE_BUILD_TYPE MATCHES DEBUG)
  target_link_libraries(${TEST_NAME}  libboost_regex-gcc8-mt-d-x64-1_69.a)
ELSEIF(CMAKE_BUILD_TYPE MATCHES RELEASE)
  target_link_libraries(${TEST_NAME}  libboost_regex.a)
ENDIF()

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_GLIBCXX_USE_CXX11_ABI=1")

set_target_properties(${TEST_NAME} PROPERTIES VERSION ${TestUtility_VERSION_STRING}
                                         CXX_STANDARD 17
                                         CXX_STANDARD_REQUIRED ON
                                         RUNTIME_OUTPUT_DIRECTORY_DEBUG  "${DEV_ROOT}/${NAME}/test/bin/debug"
                                         RUNTIME_OUTPUT_DIRECTORY_RELEASE "${DEV_ROOT}/${NAME}/test/bin/release")

add_test(NAME ${TEST_NAME}
         COMMAND ${NAME} )

Проблема Когда я запускаю cmake ../.. -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=RELEASE в реальной сборкепапка все строит отлично.Когда я запускаю его в папке сборки тестов, я получаю следующую ошибку компоновки /usr/include/boost/regex/v4/regex_match.hpp:50: undefined reference to boost::re_detail::perl_matcher<__gnu_cxx::__normal_iterator<char const*, std::string>, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::string> > >, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::match().

ТАК, я добавил флаг ABI и повторил попытку, и та же проблема.Я не понимаю, как он может ссылаться из исходной папки, но не из тестовой папки.

Это код моей test_utility.cpp

void boostTestFunc()
{
  std::string line = "Subject: Re: Lalalala";
  boost::regex pat( "^Subject: (Re: |Aw: )*(.*)" );
  boost::smatch matches;
  if (boost::regex_match(line, matches, pat))
  {
    std::cout << matches[2] << std::endl;
  }
}

Обновить вывод ссылки:

 Linking CXX executable ../../bin/release/test_test_utility
/usr/local/bin/cmake -E cmake_link_script CMakeFiles/test_test_utility.dir/link.txt --verbose=1
/opt/rh/devtoolset-8/root/usr/bin/c++  
-D_GLIBCXX_USE_CXX11_ABI=1  -O3 -DNDEBUG   CMakeFiles/test_test_utility.dir/src/main.cpp.o CMakeFiles/test_test_utility.dir/net/nas/uxhome/name/TestCmake/test_utility/src/test_utility.cpp.o  -o ../../bin/release/test_test_utility-0.1.0  -L/opt/boost/current/stage/release/lib -Wl,-rpath,/opt/boost/current/stage/release/lib -Wl,-Bstatic -lboost_regex -Wl,-Bdynamic

Выход компиляции Update2:

/usr/local/bin/cmake -S/net/nas/uxhome/name/TestCmake/test_utility/test -B/net/nas/uxhome/name/TestCmake/test_utility/test/build/release --check-build-system CMakeFiles/Makefile.cmake 0
/usr/local/bin/cmake -E cmake_progress_start /net/nas/uxhome/name/TestCmake/test_utility/test/build/release/CMakeFiles /net/nas/uxhome/name/TestCmake/test_utility/test/build/release/CMakeFiles/progress.marks
make -f CMakeFiles/Makefile2 all
make[1]: Entering directory '/net/nas/uxhome/name/TestCmake/test_utility/test/build/release'
make -f CMakeFiles/test_test_utility.dir/build.make CMakeFiles/test_test_utility.dir/depend
make[2]: Entering directory '/net/nas/uxhome/name/TestCmake/test_utility/test/build/release'
cd /net/nas/uxhome/name/TestCmake/test_utility/test/build/release && /usr/local/bin/cmake -E cmake_depends "Unix Makefiles" /net/nas/uxhome/name/TestCmake/test_utility/test /net/nas/uxhome/name/TestCmake/test_utility/test /net/nas/uxhome/name/TestCmake/test_utility/test/build/release /net/nas/uxhome/name/TestCmake/test_utility/test/build/release /net/nas/uxhome/name/TestCmake/test_utility/test/build/release/CMakeFiles/test_test_utility.dir/DependInfo.cmake --color=
make[2]: Leaving directory '/net/nas/uxhome/name/TestCmake/test_utility/test/build/release'
make -f CMakeFiles/test_test_utility.dir/build.make CMakeFiles/test_test_utility.dir/build
make[2]: Entering directory '/net/nas/uxhome/name/TestCmake/test_utility/test/build/release'

Update3: я собрал test_utility в lib и теперь в Cmake я только вызываю main и связываюсь с этой библиотекой, но связывание не удается,хотя эта библиотека / архив (статические) собрана и успешно связана [11:54] Linux [имя @ машина: / net / nas / uxhome / name / TestCmake / test_utility / test / build / debug]> make VERBOSE = 1 / usr/ local / bin / cmake -S / net / nas / uxhome / name / TestCmake / test_utility / test -B / net / nas / uxhome / name / TestCmake / test_utility / test / build / debug --check-build-system CMakeFiles/Makefile.cmake 0 / usr / local / bin / cmake -E cmake_progress_start / net / nas / uxhome / name / TestCmake / test_utility / test / build / debug / CMakeFiles / net / nas / uxhome / name / TestCmake / test_utility / test/build/debug/CMakeFiles/progress.marks

make -f CMakeFiles/Makefile2 all
make[1]: Entering directory '/net/nas/uxhome/name/TestCmake/test_utility/test/build/debug'
make -f CMakeFiles/test_test_utility.dir/build.make CMakeFiles/test_test_utility.dir/depend
make[2]: Entering directory '/net/nas/uxhome/name/TestCmake/test_utility/test/build/debug'
cd /net/nas/uxhome/name/TestCmake/test_utility/test/build/debug && /usr/local/bin/cmake -E cmake_depends "Unix Makefiles" /net/nas/uxhome/name/TestCmake/test_utility/test /net/nas/uxhome/name/TestCmake/test_utility/test /net/nas/uxhome/name/TestCmake/test_utility/test/build/debug /net/nas/uxhome/name/TestCmake/test_utility/test/build/debug /net/nas/uxhome/name/TestCmake/test_utility/test/build/debug/CMakeFiles/test_test_utility.dir/DependInfo.cmake --color=
Dependee "/net/nas/uxhome/name/TestCmake/test_utility/test/build/debug/CMakeFiles/test_test_utility.dir/DependInfo.cmake" is newer than depender "/net/nas/uxhome/name/TestCmake/test_utility/test/build/debug/CMakeFiles/test_test_utility.dir/depend.internal".
Dependee "/net/nas/uxhome/name/TestCmake/test_utility/test/build/debug/CMakeFiles/CMakeDirectoryInformation.cmake" is newer than depender "/net/nas/uxhome/name/TestCmake/test_utility/test/build/debug/CMakeFiles/test_test_utility.dir/depend.internal".
Scanning dependencies of target test_test_utility
make[2]: Leaving directory '/net/nas/uxhome/name/TestCmake/test_utility/test/build/debug'
make -f CMakeFiles/test_test_utility.dir/build.make CMakeFiles/test_test_utility.dir/build
make[2]: Entering directory '/net/nas/uxhome/name/TestCmake/test_utility/test/build/debug'
[ 50%] Building CXX object CMakeFiles/test_test_utility.dir/src/main.cpp.o
/opt/rh/devtoolset-8/root/usr/bin/c++   -I/net/nas/uxhome/name/TestCmake/test_utility/include -I/opt/boost/boost_1_69_0/boost -I/usr/local/include/catch2  -D_GLIBCXX_USE_CXX11_ABI=0  -g   -Wall -Wextra -pedantic -std=gnu++17 -o CMakeFiles/test_test_utility.dir/src/main.cpp.o -c /net/nas/uxhome/name/TestCmake/test_utility/test/src/main.cpp
[100%] Linking CXX executable ../../bin/debug/test_test_utility
...