在Github操作macos-12中使用vcpkg和cmake构建C++二进制文件时出现问题



在Linux和Windows上构建良好。

但在macos我得到:

/usr/local/bin/g++-11  -isysroot /Applications/Xcode_13.4.1.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/Calculator_Test.dir/src/speedtest.cpp.o CMakeFiles/Calculator_Test.dir/src/tests.cpp.o -o Calculator_Test  ../libCalculator.a ../vcpkg_installed/x64-osx/debug/lib/libCatch2d.a ../vcpkg_installed/x64-osx/debug/lib/manual-link/libCatch2Maind.a ../vcpkg_installed/x64-osx/debug/lib/libCatch2d.a 
Undefined symbols for architecture x86_64:
  "__ZN5Catch24translateActiveExceptionB5cxx11Ev", referenced from:
      __ZN5Catch9Benchmark9Benchmark3runINSt6chrono3_V212steady_clockEEEvv in speedtest.cpp.o
  "__ZN5Catch9Benchmark6Detail15analyse_samplesEdjN9__gnu_cxx17__normal_iteratorIPdSt6vectorIdSaIdEEEES8_", referenced from:
      __ZN5Catch9Benchmark6Detail7analyseINSt6chrono8durationIdSt5ratioILl1ELl1000000000EEEEN9__gnu_cxx17__normal_iteratorIPS7_St6vectorIS7_SaIS7_EEEEEENS0_14SampleAnalysisIT_EERKNS_7IConfigENS0_11EnvironmentISG_EET0_SN_ in speedtest.cpp.o

运行以下程序运行良好且没有错误:

cmake --preset=${{ matrix.preset }} -B build -DCalculator_Test=1 -DCMAKE_C_COMPILER=gcc-11 -DCMAKE_CXX_COMPILER=g++-11 -DCMAKE_VERBOSE_MAKEFILE=1

"预设";只是将CMAKE_TOOLCHAIN_FILE设置为vcpkg提供的CMAKE_;Unix Makefiles";

来自使用的CMakeLists.txt:

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
...
 
find_package(Catch2 CONFIG REQUIRED)
target_link_libraries(Calculator_Test
    PRIVATE
        Calculator
        Catch2::Catch2 Catch2::Catch2WithMain
)

但是当编译失败时

cmake --build build

我的问题是它为什么会失败,以及如何修复它?

是C++20出了问题,还是CMake、vcpkg或我必须在macos上做的事情。我不是macos专家:(

通过在设置vcpkg之前将环境变量设置为正确的编译器来解决问题。

在github操作yml文件中:

      - name: Set C++/C compiler on macOs
        shell: bash
        run: echo "CC=gcc-11" >> $GITHUB_ENV; echo "CXX=g++-11" >> $GITHUB_ENV; cat "$GITHUB_ENV"
        if: runner.os == 'macOs'

构建步骤(不指定c/c++编译器(:

cmake --preset=${{ matrix.preset }} -B build -DCalculator_Test=1 -DCMAKE_VERBOSE_MAKEFILE=1

我的假设是,依赖二进制文件的链接早些时候失败了,因为使用的编译器与应用程序本身不同。