C++ CMake项目取决于另一个CMake项目未解析符号
我有下面的CMake项目,它在VisualStudio和macos上编译没有问题C++ CMake项目取决于另一个CMake项目未解析符号,c++,cmake,C++,Cmake,我有下面的CMake项目,它在VisualStudio和macos上编译没有问题 #specify minimum cmake version cmake_minimum_required(VERSION 3.14) # name the project (can retreive this using ${PROJECT_NAME}) project(GLbase) # specify any specific flags we want (here we are just requiri
#specify minimum cmake version
cmake_minimum_required(VERSION 3.14)
# name the project (can retreive this using ${PROJECT_NAME})
project(GLbase)
# specify any specific flags we want (here we are just requiring at least C++11)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
# set up some variables, holds the location of source, include, dependencies, and test directories.
set(SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src")
set(INC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/include")
set(TEST_DIR "${CMAKE_CURRENT_SOURCE_DIR}/tests")
set(LIB_DIR "${CMAKE_CURRENT_SOURCE_DIR}/dependencies")
# our library files.
set(SOURCE_FILES "${SRC_DIR}/Error.cpp"
"${SRC_DIR}/GLSLShader.cpp"
"${SRC_DIR}/Renderer.cpp"
"${SRC_DIR}/Utils.cpp"
"${SRC_DIR}/GLbase.cpp"
"${SRC_DIR}/Texture.cpp"
"${SRC_DIR}/imgui/imgui_demo.cpp"
"${SRC_DIR}/imgui/imgui_draw.cpp"
"${SRC_DIR}/imgui/imgui_impl_glfw.cpp"
"${SRC_DIR}/imgui/imgui_impl_opengl3.cpp"
"${SRC_DIR}/imgui/imgui_widgets.cpp"
"${SRC_DIR}/imgui/imgui.cpp")
set(HEADER_FILES "${INC_DIR}/Binding.h"
"${INC_DIR}/Drawable.h"
"${INC_DIR}/Error.h"
"${INC_DIR}/GLSLShader.h"
"${INC_DIR}/Renderer.h"
"${INC_DIR}/Utils.h"
"${INC_DIR}/GLbase.h"
"${INC_DIR}/Texture.h"
"${INC_DIR}/stb_image.h"
"${INC_DIR}/imconfig.h"
"${INC_DIR}/imgui_impl_glfw.h"
"${INC_DIR}/imgui_impl_opengl3.h"
"${INC_DIR}/imgui_internal.h"
"${INC_DIR}/imgui.h"
"${INC_DIR}/imstb_rectpack.h"
"${INC_DIR}/imstb_textedit.h"
"${INC_DIR}/imstb_truetype.h")
# create the library
add_library(${PROJECT_NAME} SHARED ${HEADER_FILES} ${SOURCE_FILES})
# where are the includes for the library.
target_include_directories(${PROJECT_NAME} PUBLIC "${INC_DIR}")
# dont add lib prefix on macOS
SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES PREFIX "")
# Dependencies
# GLFW
set(GLFW_DIR "${LIB_DIR}/glfw")
set(GLFW_BUILD_EXAMPLES OFF CACHE INTERNAL "Build the GLFW example programs")
set(GLFW_BUILD_TESTS OFF CACHE INTERNAL "Build the GLFW test programs")
set(GLFW_BUILD_DOCS OFF CACHE INTERNAL "Build the GLFW documentation")
set(GLFW_INSTALL OFF CACHE INTERNAL "Generate installation target")
add_subdirectory("${GLFW_DIR}")
target_link_libraries(${PROJECT_NAME} "glfw" "${GLFW_LIBRARIES}")
target_include_directories(${PROJECT_NAME} PUBLIC "${GLFW_DIR}/include")
target_compile_definitions(${PROJECT_NAME} PRIVATE "GLFW_INCLUDE_NONE")
# glad
set(GLAD_DIR "${LIB_DIR}/glad")
add_library("glad" STATIC "${GLAD_DIR}/src/glad.c")
target_include_directories("glad" PRIVATE "${GLAD_DIR}/include")
target_include_directories(${PROJECT_NAME} PUBLIC "${GLAD_DIR}/include")
target_link_libraries(${PROJECT_NAME} "glad" "${CMAKE_DL_LIBS}")
# glm
set(GLM_DIR "${LIB_DIR}/glm")
add_subdirectory("${GLM_DIR}")
target_include_directories(${PROJECT_NAME} PUBLIC "${GLM_DIR}")
target_link_libraries(${PROJECT_NAME} "glm" "${CMAKE_DL_LIBS}")
# assimp
set(ASSIMP_DIR "${LIB_DIR}/assimp")
add_subdirectory("${ASSIMP_DIR}")
target_include_directories(${PROJECT_NAME} PUBLIC "${ASSIMP_DIR}")
target_link_libraries(${PROJECT_NAME} "assimp" "${CMAKE_DL_LIBS}")
然后我有一个项目,它使用上面的库作为依赖项
#specify minimum cmake version
cmake_minimum_required(VERSION 3.14)
# name the project (can retreive this using ${PROJECT_NAME})
project(GLBaseExample)
# specify any specific flags we want (here we are just requiring at least C++11)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
set(GL_BASE_DIR "${ROOT_DIR}/gl-base")
add_executable(${PROJECT_NAME} ${ROOT_DIR}/example/Test.cpp)
add_subdirectory(${GL_BASE_DIR})
target_link_libraries(${PROJECT_NAME} "GLbase" "${CMAKE_DL_LIBS}")
target_include_directories(${PROJECT_NAME} PUBLIC "${GL_BASE_DIR}/include")
项目结构为
ROOT
- GLbase
- ....
- CMakeLists.txt
- Example
- Test.cpp
- CMakeLists.txt # CMakeLists for Example/Test.cpp
当我尝试编译示例项目时,每次调用GLbase库都会得到未解析的符号,我在这里遗漏了什么?文件夹名称“gl base”正确吗?请提供一个。为什么库没有公开链接?另外,这个变量来自哪里?为什么在一个变量周围使用引号来表示它包含多个LIB的列表?如果确实存在多个库,您不希望将它们视为单个库:
“${GLFW_LIBRARIES}”
是否“gl base”是正确的文件夹名称?请提供一个。为什么库没有公开链接?另外,这个变量来自哪里?为什么在一个变量周围使用引号来表示它包含多个LIB的列表?如果确实存在多个库,您不希望将它们视为单个库:“${GLFW_LIBRARIES}”