[英]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.