Заранее большое спасибо за чтение этого длинного поста!Я пытаюсь настроить проект 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