【问题标题】:How to write a CMakeLists.txt file for UnitTest++ project如何为 UnitTest++ 项目编写 CMakeLists.txt 文件
【发布时间】:2020-01-13 16:28:57
【问题描述】:

有人问我是否可以开始使用 cmake 而不是 Makefiles 来处理我正在处理的project。我已经开始编译我的主项目,但是,我很难为使用 UnitTest++ 的test/ 目录编写CMakeLists.txt 文件。我找到了这些instructions,但我很难跟踪它们。我跑

mkdir 构建 光盘构建/ 制作.. 制作

但我得到一些链接器错误。它多次提到短语can not be used when making a PIE object; recompile with -fPIC。这是我的CMakeLists.txt 文件:

cmake_minimum_required(VERSION 3.10)

project(markets_tests)

set(CMAKE_CXX_STANDARD 17)
SET(CMAKE_CXX_COMPILER /usr/bin/g++-8)
set(CMAKE_POSITION_INDEPENDENT_CODE OFF)

find_package (Eigen3 3.3 REQUIRED NO_MODULE)
find_package(UnitTest++ REQUIRED)

SET(GCC_COVERAGE_COMPILE_FLAGS "-fPIC")
SET(CMAKE_CXX_FLAGS  "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}")

include_directories(
        "${PROJECT_SOURCE_DIR}"
        "${PROJECT_SOURCE_DIR}/../include"
        "${PROJECT_SOURCE_DIR}/../src"
        ${UTPP_INCLUDE_DIRS}
    )


file(GLOB all_SRCS
        "${PROJECT_SOURCE_DIR}/*.cpp"
        "${PROJECT_SOURCE_DIR}/../include/data_handlers.h"
        "${PROJECT_SOURCE_DIR}/../include/data_readers.h"
        "${PROJECT_SOURCE_DIR}/../include/data_execution_handler.h"
        "${PROJECT_SOURCE_DIR}/../include/fill.h"
        "${PROJECT_SOURCE_DIR}/../include/instrument.h"
        "${PROJECT_SOURCE_DIR}/../include/market_bar.h"
        "${PROJECT_SOURCE_DIR}/../include/market_snapshot.h"
        "${PROJECT_SOURCE_DIR}/../include/model_bank.h"
        "${PROJECT_SOURCE_DIR}/../include/order.h"
        "${PROJECT_SOURCE_DIR}/../include/pnl_calculator.h"
        "${PROJECT_SOURCE_DIR}/../include/portfolio.h"
        "${PROJECT_SOURCE_DIR}/../include/position_summary.h"
        "${PROJECT_SOURCE_DIR}/../src/data_handlers.h"
        "${PROJECT_SOURCE_DIR}/../src/data_readers.h"
        "${PROJECT_SOURCE_DIR}/../src/data_execution_handler.h"
        "${PROJECT_SOURCE_DIR}/../src/fill.h"
        "${PROJECT_SOURCE_DIR}/../src/instrument.h"
        "${PROJECT_SOURCE_DIR}/../src/market_bar.h"
        "${PROJECT_SOURCE_DIR}/../src/market_snapshot.h"
        "${PROJECT_SOURCE_DIR}/../src/model_bank.h"
        "${PROJECT_SOURCE_DIR}/../src/order.h"
        "${PROJECT_SOURCE_DIR}/../src/pnl_calculator.h"
        "${PROJECT_SOURCE_DIR}/../src/portfolio.h"
        "${PROJECT_SOURCE_DIR}/../src/position_summary.h"
        )

add_executable(run_tests ${all_SRCS})
target_link_libraries (run_tests Eigen3::Eigen stdc++fs UnitTest++)

根据 [此处] 给出的建议,我添加了 set(CMAKE_POSITION_INDEPENDENT_CODE OFF),但无济于事。

这是运行 make 的全部输出:

t@t-XPS-13-9365:~/markets/test/build$ make
Scanning dependencies of target run_tests
[  7%] Building CXX object CMakeFiles/run_tests.dir/run_tests.cpp.o
[ 15%] Building CXX object CMakeFiles/run_tests.dir/test_data_handler.cpp.o
[ 23%] Building CXX object CMakeFiles/run_tests.dir/test_data_reader.cpp.o
[ 30%] Building CXX object CMakeFiles/run_tests.dir/test_exec_handler.cpp.o
[ 38%] Building CXX object CMakeFiles/run_tests.dir/test_fill.cpp.o
[ 46%] Building CXX object CMakeFiles/run_tests.dir/test_instrument.cpp.o
[ 53%] Building CXX object CMakeFiles/run_tests.dir/test_market_bar.cpp.o
[ 61%] Building CXX object CMakeFiles/run_tests.dir/test_market_snapshot.cpp.o
[ 69%] Building CXX object CMakeFiles/run_tests.dir/test_order.cpp.o
[ 76%] Building CXX object CMakeFiles/run_tests.dir/test_pnl_calculator.cpp.o
[ 84%] Building CXX object CMakeFiles/run_tests.dir/test_portfolio.cpp.o
[ 92%] Building CXX object CMakeFiles/run_tests.dir/test_position_summary.cpp.o
[100%] Linking CXX executable run_tests
/usr/bin/ld: /usr/local/lib/libUnitTest++.a(MemoryOutStream.cpp.o): relocation R_X86_64_32 against `.rodata.str1.8' can not be used when making a PIE object; recompile with -fPIC
/usr/bin/ld: /usr/local/lib/libUnitTest++.a(RequiredCheckException.cpp.o): relocation R_X86_64_32S against symbol `_ZTVN8UnitTest22RequiredCheckExceptionE' can not be used when making a PIE object; recompile with -fPIC
/usr/bin/ld: /usr/local/lib/libUnitTest++.a(Test.cpp.o): relocation R_X86_64_32 against `.bss' can not be used when making a PIE object; recompile with -fPIC
/usr/bin/ld: /usr/local/lib/libUnitTest++.a(TestRunner.cpp.o): relocation R_X86_64_32S against symbol `_ZTVN8UnitTest18TestReporterStdoutE' can not be used when making a PIE object; recompile with -fPIC
/usr/bin/ld: /usr/local/lib/libUnitTest++.a(CurrentTest.cpp.o): relocation R_X86_64_32 against `.bss' can not be used when making a PIE object; recompile with -fPIC
/usr/bin/ld: /usr/local/lib/libUnitTest++.a(SignalTranslator.cpp.o): relocation R_X86_64_32S against `.text' can not be used when making a PIE object; recompile with -fPIC
/usr/bin/ld: /usr/local/lib/libUnitTest++.a(AssertException.cpp.o): relocation R_X86_64_32S against symbol `_ZTVN8UnitTest15AssertExceptionE' can not be used when making a PIE object; recompile with -fPIC
/usr/bin/ld: /usr/local/lib/libUnitTest++.a(TestReporterStdout.cpp.o): relocation R_X86_64_32 against `.rodata.str1.8' can not be used when making a PIE object; recompile with -fPIC
/usr/bin/ld: final link failed: Nonrepresentable section on output
collect2: error: ld returned 1 exit status
CMakeFiles/run_tests.dir/build.make:381: recipe for target 'run_tests' failed
make[2]: *** [run_tests] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/run_tests.dir/all' failed
make[1]: *** [CMakeFiles/run_tests.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2

即使错误消息并没有真正暗示这一点,可能是因为它没有重新编译 test/ 目录之前的目录中的所有 .cpps 吗?我没有看到 g++ 编译的任何输出。

【问题讨论】:

  • 你为什么要添加.h文件作为源文件???这不可能。
  • @SergeyA 这些是测试.cpp 文件所需的类的标题。将项目编译为库并链接它可能更常见,但我在这里是这样做的。
  • 无论您的项目是什么,您都永远不会将 .h 文件列为源文件。
  • 标头旨在被包含,而不是编译。
  • @user4581301 我一般都知道构建过程是有效的。我认为我遇到的困难是 cmake 命令。如您所见,我采用了反复试验和方法。

标签: c++ unit-testing cmake linker unittest++


【解决方案1】:

This answer 建议添加-no-pie 标志,然后“修复”它。我当前的 cmake 文件如下(它仍然不起作用,但至少这些特定的链接器错误不再存在)。

cmake_minimum_required(VERSION 3.10)

project(markets_tests)

set(CMAKE_CXX_STANDARD 17)
SET(CMAKE_CXX_COMPILER /usr/bin/g++-8)
set(CMAKE_POSITION_INDEPENDENT_CODE OFF)

find_package (Eigen3 3.3 REQUIRED NO_MODULE)
find_package(UnitTest++ REQUIRED)

SET(GCC_COVERAGE_COMPILE_FLAGS "-no-pie")
SET(CMAKE_CXX_FLAGS  "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}")

include_directories(
        "${PROJECT_SOURCE_DIR}"
        "${PROJECT_SOURCE_DIR}/../include"
        ${UTPP_INCLUDE_DIRS}
    )


file(GLOB all_SRCS
        "${PROJECT_SOURCE_DIR}/*.cpp"
        "${PROJECT_SOURCE_DIR}/../src/data_handlers.cpp"
        "${PROJECT_SOURCE_DIR}/../src/data_readers.cpp"
        "${PROJECT_SOURCE_DIR}/../src/data_execution_handler.cpp"
        "${PROJECT_SOURCE_DIR}/../src/fill.cpp"
        "${PROJECT_SOURCE_DIR}/../src/instrument.cpp"
        "${PROJECT_SOURCE_DIR}/../src/market_bar.cpp"
        "${PROJECT_SOURCE_DIR}/../src/market_snapshot.cpp"
        "${PROJECT_SOURCE_DIR}/../src/model_bank.cpp"
        "${PROJECT_SOURCE_DIR}/../src/order.cpp"
        "${PROJECT_SOURCE_DIR}/../src/pnl_calculator.cpp"
        "${PROJECT_SOURCE_DIR}/../src/portfolio.cpp"
        "${PROJECT_SOURCE_DIR}/../src/position_summary.cpp"
        )

add_executable(run_tests ${all_SRCS})
target_link_libraries (run_tests Eigen3::Eigen stdc++fs UnitTest++)

【讨论】:

    猜你喜欢
    • 2023-03-16
    • 2019-12-17
    • 2022-08-15
    • 1970-01-01
    • 1970-01-01
    • 2017-11-26
    • 2020-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多