C++ 如何从cmake文件中的另一个目录添加源文件?
我正试图为我正在处理的项目中的C++ 如何从cmake文件中的另一个目录添加源文件?,c++,cmake,C++,Cmake,我正试图为我正在处理的项目中的test/目录编写一个CMakeLists.txt文件。test/的目录树为 test/ ├── CMakeLists.txt ├── data_handlers.o ├── Makefile ├── run_tests.cpp ├── test_data │ ├── QLD.csv │ └── SPY.csv ├── test_data_handler.cpp ├── test_data_reader.cpp ├── test_exec_handler.c
test/
目录编写一个CMakeLists.txt
文件。test/
的目录树为
test/
├── CMakeLists.txt
├── data_handlers.o
├── Makefile
├── run_tests.cpp
├── test_data
│ ├── QLD.csv
│ └── SPY.csv
├── 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
我正在做的不寻常的事情是,这些测试正在测试的所有源文件都没有编译为库,并且该目录也有自己的CMakeLists.txt
。因此,这个属于test/
的cmake文件也必须编译并链接这些家伙。然而,我得到了一百万个未定义的引用
错误,它找不到在此测试
目录之外定义的内容
下面是test/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 "-no-pie")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}")
include_directories(
"${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++)
编辑
下面是整个项目的树
t@t-XPS-13-9365:~/markets$ tree
.
├── build
│ ├── CMakeCache.txt
│ ├── CMakeFiles
│ │ ├── 3.10.2
│ │ │ ├── CMakeCCompiler.cmake
│ │ │ ├── CMakeCXXCompiler.cmake
│ │ │ ├── CMakeDetermineCompilerABI_C.bin
│ │ │ ├── CMakeDetermineCompilerABI_CXX.bin
│ │ │ ├── CMakeSystem.cmake
│ │ │ ├── CompilerIdC
│ │ │ │ ├── a.out
│ │ │ │ ├── CMakeCCompilerId.c
│ │ │ │ └── tmp
│ │ │ └── CompilerIdCXX
│ │ │ ├── a.out
│ │ │ ├── CMakeCXXCompilerId.cpp
│ │ │ └── tmp
│ │ ├── cmake.check_cache
│ │ ├── CMakeDirectoryInformation.cmake
│ │ ├── CMakeOutput.log
│ │ ├── CMakeTmp
│ │ ├── feature_tests.bin
│ │ ├── feature_tests.c
│ │ ├── feature_tests.cxx
│ │ ├── Makefile2
│ │ ├── Makefile.cmake
│ │ ├── progress.marks
│ │ ├── run_backtest.dir
│ │ │ ├── build.make
│ │ │ ├── cmake_clean.cmake
│ │ │ ├── CXX.includecache
│ │ │ ├── DependInfo.cmake
│ │ │ ├── depend.internal
│ │ │ ├── depend.make
│ │ │ ├── flags.make
│ │ │ ├── link.txt
│ │ │ ├── progress.make
│ │ │ └── src
│ │ │ ├── data_handlers.cpp.o
│ │ │ ├── data_readers.cpp.o
│ │ │ ├── execution_handler.cpp.o
│ │ │ ├── fill.cpp.o
│ │ │ ├── instrument.cpp.o
│ │ │ ├── main.cpp.o
│ │ │ ├── market_bar.cpp.o
│ │ │ ├── market_snapshot.cpp.o
│ │ │ ├── model_bank.cpp.o
│ │ │ ├── order.cpp.o
│ │ │ ├── pnl_calculator.cpp.o
│ │ │ ├── portfolio.cpp.o
│ │ │ └── position_summary.cpp.o
│ │ └── TargetDirectories.txt
│ ├── cmake_install.cmake
│ ├── Makefile
│ └── run_backtest
├── CMakeLists.txt
├── data
│ ├── QLD.csv
│ └── SPY.csv
├── include
│ ├── data_handlers.h
│ ├── data_readers.h
│ ├── execution_handler.h
│ ├── fill.h
│ ├── instrument.h
│ ├── market_bar.h
│ ├── market_snapshot.h
│ ├── model_bank.h
│ ├── order.h
│ ├── pnl_calculator.h
│ ├── portfolio.h
│ └── position_summary.h
├── README.md
├── scripts
│ └── download_raw_daily_data.r
├── src
│ ├── data_handlers.cpp
│ ├── data_readers.cpp
│ ├── execution_handler.cpp
│ ├── fill.cpp
│ ├── instrument.cpp
│ ├── main.cpp
│ ├── market_bar.cpp
│ ├── market_snapshot.cpp
│ ├── model_bank.cpp
│ ├── order.cpp
│ ├── pnl_calculator.cpp
│ ├── portfolio.cpp
│ └── position_summary.cpp
└── test
├── CMakeLists.txt
├── data_handlers.o
├── Makefile
├── run_tests.cpp
├── test_data
│ ├── QLD.csv
│ └── SPY.csv
├── 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
编辑2
我试图考虑squareskittles下面提出的解决方案。下面是我在顶级目录中的CMakeLists.txt
:
cmake_minimum_required(VERSION 3.10)
project(markets)
set(CMAKE_CXX_STANDARD 17)
SET(CMAKE_CXX_COMPILER /usr/bin/g++-8)
find_package (Eigen3 3.3 REQUIRED NO_MODULE)
include_directories(
${PROJECT_SOURCE_DIR}/include
${PROJECT_SOURCE_DIR}/src
)
file(GLOB all_SRCS
"${PROJECT_SOURCE_DIR}/include/*.h"
"${PROJECT_SOURCE_DIR}/src/*.cpp"
)
add_executable(run_backtest ${all_SRCS})
add_library(MarketLibrary ${all_SRCS})
add_subdirectory(test)
target_link_libraries (run_backtest Eigen3::Eigen stdc++fs)
当我尝试
cmake..
时,它将永远运行。如果您的顶级CMakeLists.txt
文件创建了库(例如,MarketLibrary
),您可以引用它并将其链接到其他cmake文件中的测试可执行文件。这将有助于处理未定义的引用错误:
CMakeLists.txt:
...
add_library(MarketLibrary
src/data_handlers.cpp
src/data_readers.cpp
...
)
...
add_subdirectory(test)
test/CMakeLists.txt(修改目标链接库()
命令):
这是大型CMake项目的
CMakeLists.txt
文件吗?如果是这样,您可以引用以前使用CMake变量在上游构建的库。@squareskittles这是个好主意。参见编辑在您的编辑中,您应该将add_子目录()
移到末尾。此外,由于您的顶级CMake设置了CMake\u CXX\u标准
和CMake\u CXX\u编译器
,因此您不应该将它们放在较低级别的CMake中。事实上,应该在调用project()
之前设置这些参数,这可能就是您的CMake挂起的原因。。。您还只需要为Eigen3查找一次find_package()
。@squareskittles是的,修复了挂起问题,但现在它找不到带有#include
的Eigen标头。什么找不到Eigen标头?你的最高目标是什么?还是test/
目录中的测试?以前是否找到过标题?在这种情况下,运行make VERBOSE=1
从make
打开其他日志记录,以确定是否将正确的Eigen include目录传递给编译器是很有帮助的。
project(markets_tests)
...
add_executable(run_tests ${all_SRCS})
target_link_libraries(run_tests Eigen3::Eigen stdc++fs UnitTest++ MarketLibrary)