Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何从cmake文件中的另一个目录添加源文件?_C++_Cmake - Fatal编程技术网

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)