0

我有一个包含两个文件夹的 C++ 项目文件夹。

  1. 具有多个子文件夹和 CmakeList.txt 文件的 C++ src 文件夹。src 文件夹包含 main.cpp 文件。

    **Cmakelist.txt src folder**
    project (TestProject)
    # Include all global directories and the current directory
    include_directories(${GLOBAL_INCLUDES} ".")
    link_directories(${GLOBAL_LIB_DIRS})
    file(GLOB_RECURSE GLOBAL_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}" "*.cpp")
    add_executable(${PROJECT_NAME} ${GLOBAL_SOURCES})
    target_link_libraries(${PROJECT_NAME} ${GLOBAL_LIBS})
    set_target_properties(${PROJECT_NAME} PROPERTIES DEBUG_POSTFIX "d")
    install(TARGETS ${PROJECT_NAME} DESTINATION ${INSTALL_DIR})
    
  2. 一个 C++ 构建标准外部文件夹 ExtLib,其中包含多个子文件夹和一个用于编译的 build.sh 脚本和 CmakeList.txt 文件。src 文件夹中的 .cpp 文件链接(包括 header(.h) 文件)到这个 ExtLib 文件夹。

Project 文件夹包含一个主 build.sh 文件,该文件编译项目并创建一个包含调试和发布配置的构建文件夹。它还包含一个 CmakeList.txt 文件,我想它会在 build.sh 文件执行时执行。我需要在这个项目上执行的任务是创建一个新的测试文件夹并添加一个文件 (RunAllTests.cpp),该文件对 src 文件夹 .cpp 文件中编写的代码执行单元测试(使用 catch 单元测试)。

我面临的问题:

  • 第一个问题是当我在我的测试文件夹中创建一个源测试文件并尝试从 src 文件夹中包含头文件时,编译器会抛出一个致命错误,即找不到此类 (.h) 文件,这意味着如果我在其中包含一个文件测试文件夹源文件,其中包括来自 ExtLib 文件夹的头文件 - 然后我通过 src 文件夹文件在测试文件夹文件中链接来自 ExtLib 文件夹的文件时出错。我所有的 Cmakelist 文件都正确写入了吗?

    **Cmakelist.txt tests folder**
    cmake_minimum_required(VERSION 3.5)
    set_property(GLOBAL PROPERTY USE_FOLDERS ON)
    include_directories(../src)
    include_directories(../ExtLib)
    link_directories(${GLOBAL_LIB_DIRS})
    add_library(AConfigTest ./aconfigtest/AConfigTest.cpp)
    add_library(AClientTest ./aclienttest/AClientTest.cpp)
    add_library(AServerTest ./aservertest/AServerTest.cpp)
    file(GLOB_RECURSE GLOBAL_SOURCES 
         "${PROJECT_SOURCE_DIR}/src/AConfig/*.cpp"
         "${PROJECT_SOURCE_DIR}/src/AClient/*.cpp" 
         "${PROJECT_SOURCE_DIR}/src/AServer/*.cpp"
         "${PROJECT_SOURCE_DIR}/src/ErrorLogger.cpp"
    )
    add_executable(tests RunAllTests.cpp ${GLOBAL_SOURCES})
    set_target_properties(tests PROPERTIES DEBUG_POSTFIX "d")
    target_link_libraries(tests ${GLOBAL_LIBS} 
        AConfigTest
        AClientTest
        AServerTest
    )
    
  • 第二个问题是,如果通过某种方式我能够成功地包含来自其他 src 或 ExtLib 文件夹的文件,我如何能够运行测试源文件 RunAllTests.cpp 来执行我的测试用例?我所有的 Cmakelist 文件都正确写入了吗?

自从 3 周以来,我一直被困在这个问题上,我迫切需要一个解决方案。下面是编译器错误:

编译器错误:

make[2]: Entering directory '/home/Caspian/TestProject/build/linux/debug'
[ 56%] Building CXX object tests/CMakeFiles/tests.dir/RunAllTests.cpp.o
cd /home/Caspian/TestProject/build/linux/debug/tests && /usr/bin/c++    -I/home/Caspian/TestProject/tests/../src -I/home/Caspian/TestProject/tests/../ExtLib  -g   -o CMakeFiles/tests.dir/RunAllTests.cpp.o -c /home/Caspian/TestProject/tests/RunAllTests.cpp
In file included from /home/Caspian/TestProject/tests/RunAllTests.cpp:14:0:
/home/Caspian/TestProject/tests/../src/AConfig/Config.h:16:29: fatal error: xxplatformlayer.h: No such file or directory
compilation terminated.
tests/CMakeFiles/tests.dir/build.make:62: recipe for target 'tests/CMakeFiles/tests.dir/RunAllTests.cpp.o' failed
make[2]: *** [tests/CMakeFiles/tests.dir/RunAllTests.cpp.o] Error 1
make[2]: Leaving directory '/home/Caspian/TestProject/build/linux/debug'
CMakeFiles/Makefile2:277: recipe for target 'tests/CMakeFiles/tests.dir/all' failed
make[1]: *** [tests/CMakeFiles/tests.dir/all] Error 2
make[1]: Leaving directory '/home/Caspian/TestProject/build/linux/debug'
Makefile:127: recipe for target 'all' failed
make: *** [all] Error 2
make failed.

项目层次结构如下所示:

/TestProject 
  │   build.sh
  │   CMakeList.txt
  /ExtLib
      │   build.sh
      │   CMakeList.txt
      │   debug
      │   release
      │   A/include/..(multiple subfolders and .cpp files)
  /src
      │   build.sh
      │   CMakeList.txt
      │   AServer(multiple subfolders and .cpp files)
      │   AClient(multiple subfolders and .cpp files)
      │   AConfigt(multiple subfolders and .cpp files)
  /tests
      │   CMakeList.txt
      │   RunAllTests.cpp
      │   aservertest/AServerTest.cpp (testing src AServer)
      │   aclienttest/AClientTest.cpp (testing src AClient)
      │   aconfigtest/AConfigTest.cpp (testing src AConfig)
4

0 回答 0