0

所以,我有一个 CMakeLists 项目,树如下:

proj dir:  
  --include
      window.h
      scene.h
      etc.  
  --src
      window.cpp
      scene.cpp
      main.cpp
      etc.
  --external
      --glad
      --SOIL
      --Catch2
  --tests
      CMakeLists.txt
      window_test.cpp
      main.cpp
 CMakeLists.txt

我尝试使用 Catch2 lib 在测试 root make 项目中进行单元测试。但是当我尝试构建我的 unit_test proj 时,会出现以下错误:

Undefined symbols for architecture x86_64:
  "_glfwCreateWindow", referenced from:
      mlg::System::Window::create() in libSimplePaint.a(window.cpp.o)
  "_glfwInit", referenced from:
      mlg::System::Window::Window(int, int, char const*) in libSimplePaint.a(window.cpp.o)
  "_glfwMakeContextCurrent", referenced from:
      mlg::System::Window::create() in libSimplePaint.a(window.cpp.o)
  "_glfwSetFramebufferSizeCallback", referenced from:
      mlg::System::Window::setFramebufferSizeCallback() const in libSimplePaint.a(window.cpp.o)
  "_glfwTerminate", referenced from:
      mlg::System::Window::close() const in libSimplePaint.a(window.cpp.o)
      mlg::System::Window::create() in libSimplePaint.a(window.cpp.o)
  "_glfwWindowHint", referenced from:
      mlg::System::Window::Window(int, int, char const*) in libSimplePaint.a(window.cpp.o)
  "_glfwWindowShouldClose", referenced from:
      mlg::System::Window::isOpen() const in libSimplePaint.a(window.cpp.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [SimplePaint_UnitTests] Error 1
make[1]: *** [CMakeFiles/SimplePaint_UnitTests.dir/all] Error 2
make: *** [all] Error 2

项目 CMakeLists:

cmake_minimum_required(VERSION 3.11 FATAL_ERROR) 

project(SimplePaint)

set(CMAKE_CXX_FLAGS        "${CMAKE_CXX_FLAGS} -std=c++17")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lglfw -framework Cocoa -framework OpenGL -framework IOKit -framework CoreVideo")

set(SRC_DIR     "${CMAKE_CURRENT_SOURCE_DIR}/src")
set(LIBS_DIR    "${CMAKE_CURRENT_SOURCE_DIR}/external")
set(INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/include")
set(BUILD_DIR   "${CMAKE_CURRENT_SOURCE_DIR}/build")

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${BUILD_DIR}/bin")

file(GLOB SOURCES "${SRC_DIR}/*.cpp" "${SRC_DIR}/*.vert" "${SRC_DIR}/*.frag")
file(GLOB HEADERS "${INCLUDE_DIR}/*.h" "${INCLUDE_DIR}/*.hpp")

add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS})
target_include_directories(${PROJECT_NAME} PUBLIC ${INCLUDE_DIR})

# SOIL
include_directories(${soil_lib})
set(SOIL_LIBRARY ${LIBS_DIR}/SOIL/libsoil.a)
target_link_libraries(${PROJECT_NAME} ${SOIL_LIBRARY})

# glad
set(GLAD_DIR "${LIBS_DIR}/glad")
add_library("GLAD" "${GLAD_DIR}/src/glad.c")
target_include_directories("GLAD" PRIVATE "${GLAD_DIR}/include")
target_include_directories(${PROJECT_NAME} PRIVATE "${GLAD_DIR}/include")
target_link_libraries(${PROJECT_NAME} "GLAD" "${CMAKE_DL_LIBS}")

单元测试 CMakeLists:

cmake_minimum_required(VERSION 3.11 FATAL_ERROR)

project(SimplePaint_UnitTests)
# This module will be used for downloading third party code.
include(ExternalProject)

set(THIRDPARTY "${CMAKE_CURRENT_SOURCE_DIR}/../external")

ExternalProject_Add(
    Catch2

    GIT_REPOSITORY      "https://github.com/catchorg/Catch2.git"
    GIT_TAG             "master"

    SOURCE_DIR          "${THIRDPARTY}/Catch2-master"

    # Don't update and patch.
    UPDATE_COMMAND      ""
    PATCH_COMMAND       ""

    # Don't configure and build.
    CONFIGURE_COMMAND   ""
    BUILD_COMMAND       ""

    # Don't test and install.
    TEST_COMMAND        ""
    INSTALL_COMMAND     "")


set(Catch2_INCLUDE_DIR "${THIRDPARTY}/Catch2-master/single_include")

ExternalProject_Add(
    GLM

    GIT_REPOSITORY      "https://github.com/g-truc/glm.git"
    GIT_TAG             "0.9.4.6"

    SOURCE_DIR          "${THIRDPARTY}/glm-0.9.4.6"

    # Don't update and patch.
    UPDATE_COMMAND      ""
    PATCH_COMMAND       ""

    # Don't configure and build.
    CONFIGURE_COMMAND   ""
    BUILD_COMMAND       ""

    # Don't test and install.
    TEST_COMMAND        ""
    INSTALL_COMMAND     "")

set(GLM_INCLUDE_DIRS "${THIRDPARTY}/glm-0.9.4.6")

add_library(SimplePaint STATIC

    "${THIRDPARTY}/glad/src/glad.c"
    "${CMAKE_CURRENT_SOURCE_DIR}/../src/main.cpp"
    "${CMAKE_CURRENT_SOURCE_DIR}/../src/window.cpp"
    )

target_include_directories(SimplePaint PUBLIC

    "${THIRDPARTY}/glad/include"
    "${CMAKE_CURRENT_SOURCE_DIR}/../include"
    "${CMAKE_CURRENT_SOURCE_DIR}/../src"
    "${GLM_INCLUDE_DIRS}"
    )

target_compile_features(SimplePaint PUBLIC cxx_std_17)

add_dependencies(SimplePaint GLM)

add_executable(${PROJECT_NAME}

    "${CMAKE_CURRENT_SOURCE_DIR}/window_test.cpp"
    "${CMAKE_CURRENT_SOURCE_DIR}/main.cpp"
    )

target_include_directories(${PROJECT_NAME} PRIVATE ${Catch2_INCLUDE_DIR})

target_link_libraries(${PROJECT_NAME} SimplePaint)

add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND "$<TARGET_FILE:${PROJECT_NAME}>")

add_dependencies(${PROJECT_NAME} Catch2)

我做错了什么?我包括 GLFW 并且很高兴这样:

#include <glad/glad.h>
#define GLFW_INCLUDE_NONE
#include <GLFW/glfw3.h>

如果我只构建我的项目而没有单元测试所有工作和构建。编译器 Clang 10.0

4

0 回答 0