我的cmake项目中出现“未定义引用”错误

时间:2019-09-13 14:34:12

标签: c++ cmake linker eigen3 unittest++

my c++ project组织为cmake项目时遇到了一些麻烦,这是我的新手。我正在尝试模仿this github repository给定的模板。我想我快要到了,但是当我尝试使用以下命令进行编译时,出现了一些链接器错误:

cd markets
rm -rf build/manual
mkdir build/manual
cd build/manual
cmake -G "Unix Makefiles" -D CMAKE_CXX_COMPILER=/usr/bin/g++-8 ../..
make

有很多输出,但这是前几行:

[100%] Linking CXX executable markets_tests
CMakeFiles/markets_tests.dir/src/test_data_handler.cpp.o: In function `Testtest_data_handler::RunImpl() const':
test_data_handler.cpp:(.text+0x12a): undefined reference to `Instrument::Instrument(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
test_data_handler.cpp:(.text+0x153): undefined reference to `Instrument::Instrument(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
test_data_handler.cpp:(.text+0x37f): undefined reference to `DataHandler::DataHandler(std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, unsigned int const&, unsigned int const&)'
CMakeFiles/markets_tests.dir/src/test_data_reader.cpp.o: In function `Testtest_csv_reader::RunImpl() const':
test_data_reader.cpp:(.text+0xa9): undefined reference to `csv_reader(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned int)'

我猜想这必须表示我的markets/test/CMakeLists.txt文件存在问题,该文件现在为:

cmake_minimum_required(VERSION 3.10)
project(markets_tests)


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

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

include_directories(${MARKETS_HEADERS_DIR})
include_directories(${UTPP_INCLUDE_DIRS})

set(SOURCE_FILES main.cpp 
         src/test_data_handler.cpp
         src/test_data_reader.cpp
         src/test_exec_handler.cpp
         src/test_fill.cpp
         src/test_instrument.cpp
         src/test_market_bar.cpp
         src/test_market_snapshot.cpp
         src/test_order.cpp
         src/test_pnl_calculator.cpp
         src/test_portfolio.cpp
         src/test_position_summary.cpp) 

add_executable(markets_tests ${SOURCE_FILES})
target_link_libraries(markets_tests markets Eigen3::Eigen UnitTest++)  # added Eigen
install(TARGETS markets_tests DESTINATION bin)

有什么想法吗?其他问题似乎暗示我可能以错误的顺序链接事物,但是此项目结构并不那么复杂(只是可执行文件,库和某些单元测试)。这是用我的旧makefile编译的,所以我怀疑是因为我还没有定义一些头文件定义。

如果有帮助,这里是我的tree根目录的markets/

.
├── bin
├── build
│   └── manual
├── CMakeLists.txt
├── docs
├── lib
├── README.md
├── src
│   ├── CMakeLists.txt
│   ├── main.cpp
│   └── markets
│       ├── CMakeLists.txt
│       ├── data_handlers.cpp
│       ├── data_handlers.h
│       ├── data_readers.cpp
│       ├── data_readers.h
│       ├── execution_handler.cpp
│       ├── execution_handler.h
│       ├── fill.cpp
│       ├── fill.h
│       ├── instrument.cpp
│       ├── instrument.h
│       ├── market_bar.cpp
│       ├── market_bar.h
│       ├── market_snapshot.cpp
│       ├── market_snapshot.h
│       ├── order.cpp
│       ├── order.h
│       ├── pnl_calculator.cpp
│       ├── pnl_calculator.h
│       ├── portfolio.cpp
│       ├── portfolio.h
│       ├── position_summary.cpp
│       └── position_summary.h
└── test
    ├── CMakeLists.txt
    ├── main.cpp
    ├── src
    │   ├── test_data_handler.cpp
    │   ├── test_data_reader.cpp
    │   ├── test_exec_handler.cpp
    │   ├── test_fill.cpp
    │   ├── test_instrument.cpp
    │   ├── test_market_bar.cpp
    │   ├── test_market_snapshot.cpp
    │   ├── test_order.cpp
    │   ├── test_pnl_calculator.cpp
    │   ├── test_portfolio.cpp
    │   └── test_position_summary.cpp
    └── test_data
        ├── QLD.csv
        └── SPY.csv

编辑:

这里是src/markets/CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(markets)### C CXX)

set(SOURCE_FILES
    data_handlers.h
    data_handlers.cpp
    data_readers.h
    data_readers.cpp
    execution_handler.h
    execution_handler.cpp
    fill.h
    fill.cpp
    instrument.h
    instrument.cpp
    market_bar.h
    market_bar.cpp
    market_snapshot.h
    market_snapshot.cpp
    order.h
    order.cpp
    pnl_calculator.h
    pnl_calculator.cpp
    portfolio.h
    portfolio.cpp
    position_summary.h
    position_summary.cpp
)

find_package (Eigen3 3.3 REQUIRED NO_MODULE)
add_library(markets SHARED STATIC ${SOURCE_FILES})
target_link_libraries(markets Eigen3::Eigen stdc++fs) #added this

install(TARGETS markets DESTINATION ${MARKETS_INSTALL_LIB_DIR})
install(FILES markets.h DESTINATION ${MARKETS_INSTALL_INCLUDE_DIR})

0 个答案:

没有答案