簡體   English   中英

Boost.Test linker 與預編譯頭文件 (PCH) 一起使用時出錯

[英]Boost.Test linker error by use with precompiled headers (PCH)

使用帶有預編譯 header (PCH) 的 Boost.Test 時出現 linker 錯誤,如果沒有 PCH,則不會發生該錯誤。 我使用用法變量中描述的動態鏈接庫。 如何修復錯誤以將 Boost.Test 也與 PCH 一起使用?

問題至少出現在 Fedora 和 boost 1.73(只有動態庫)和 g++ 10/clang 11 中。

    $ cmake ../ && make
    -- Configuring done
    -- Generating done
    -- Build files have been written to: /home/.../boost_test_pch/build
    [ 33%] Building CXX object CMakeFiles/boost_utf_pch.dir/test_driver.cpp.o
    [ 66%] Building CXX object CMakeFiles/boost_utf_pch.dir/test.cpp.o
    [100%] Linking CXX executable boost_utf_pch
    [100%] Built target boost_utf_pch

對比

    $ cmake -DEDA_ENABLE_PCH=TRUE ../ && make
    -- Configuring done
    -- Generating done
    -- Build files have been written to: /home/.../boost_test_pch/build
    [ 25%] Building CXX object CMakeFiles/boost_utf_pch.dir/cmake_pch.hxx.gch
    [ 50%] Building CXX object CMakeFiles/boost_utf_pch.dir/test_driver.cpp.o
    cc1plus: warning: /home/.../boost_test_pch/build/CMakeFiles/boost_utf_pch.dir/cmake_pch.hxx.gch: not used because `BOOST_TEST_DYN_LINK' is defined [-Winvalid-pch]
    [ 75%] Building CXX object CMakeFiles/boost_utf_pch.dir/test.cpp.o
    [100%] Linking CXX executable boost_utf_pch
    /usr/bin/ld: /usr/lib/gcc/x86_64-redhat-linux/10/../../../../lib64/crt1.o: in function `_start':
    (.text+0x24): undefined reference to `main'
    collect2: error: ld returned 1 exit status
    make[2]: *** [CMakeFiles/boost_utf_pch.dir/build.make:138: boost_utf_pch] Error 1
    make[1]: *** [CMakeFiles/Makefile2:95: CMakeFiles/boost_utf_pch.dir/all] Error 2
    make: *** [Makefile:103: all] Error 2

之前的警告信息我無能為力...

這里的操場文件:

  • CMakeLists.txt:

     project(boost_utf_pch LANGUAGES CXX) cmake_minimum_required(VERSION 3.18) add_executable(${PROJECT_NAME} "") find_package(Boost 1.73.0 REQUIRED COMPONENTS unit_test_framework) target_sources(${PROJECT_NAME} PRIVATE test_driver.cpp test.cpp) target_link_libraries(${PROJECT_NAME} PRIVATE Boost::unit_test_framework) set_source_files_properties(test_driver.cpp APPEND PROPERTIES COMPILE_DEFINITIONS "BOOST_TEST_DYN_LINK") option(EDA_ENABLE_PCH "Enable PCH" OFF) if (EDA_ENABLE_PCH) target_precompile_headers(${PROJECT_NAME} PRIVATE pch.hpp) endif()
  • pch.hpp

     #pragma once #include <boost/test/unit_test.hpp>
  • 測試.cpp

     #include <boost/test/unit_test.hpp> BOOST_AUTO_TEST_SUITE( my_test ) BOOST_AUTO_TEST_CASE( test_case1 ) { BOOST_TEST_WARN( sizeof(int) < 4U ); } BOOST_AUTO_TEST_SUITE_END()
  • 測試驅動程序.cpp

     #define BOOST_TEST_MODULE "Boost.UTF PCH Test Suite" #include <boost/test/unit_test.hpp>

Alan Birtles 得到了正確方向的提示。 我不知道編譯器開關 BOOST_TEST_DYN_LINK 對 PCH 上下文中單個文件的影響。 項目所有文件的定義,格式為:

    target_compile_definitions(${PROJECT_NAME} PRIVATE
        "BOOST_TEST_DYN_LINK")  

無法理解並不能解決問題。 只有在為驅動程序“main”設置屬性SKIP_PRECOMPILE_HEADERS后,它才會按預期編譯和鏈接:

    project(boost_utf_pch LANGUAGES CXX)
    cmake_minimum_required(VERSION 3.18)

    add_executable(${PROJECT_NAME} "")

    find_package(Boost 1.73.0 REQUIRED COMPONENTS 
        unit_test_framework)

    target_sources(${PROJECT_NAME} PRIVATE
        test_driver.cpp test.cpp)

    target_link_libraries(${PROJECT_NAME} PRIVATE
        Boost::unit_test_framework)

    set_source_files_properties(test_driver.cpp
        APPEND PROPERTIES COMPILE_DEFINITIONS "BOOST_TEST_DYN_LINK")
    set_source_files_properties(test_driver.cpp
        PROPERTIES SKIP_PRECOMPILE_HEADERS ON)
        
    option(EDA_ENABLE_PCH "Enable PCH" ON)

    if (EDA_ENABLE_PCH)
        target_precompile_headers(${PROJECT_NAME} PRIVATE pch.hpp)
    endif()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM