CMake、Visual Studio 和未解析的外部符号

问题描述

我正在尝试在 Visual Studio 中运行一个程序,同时使用 cmake 构建它,但是,关于我尝试链接的一些库,我收到“未解决的外部 sumbol”错误。我明白我面临什么样的问题,但我是 CMake 的新手,虽然我已经阅读了很多关于它的东西,但我不太明白为什么 CMake 不链接库中的函数定义。我必须在此注意,在我的代码中,可以找到带有声明的头文件(通常与带有定义的文件位于同一目录中)。

我的项目源文件位于一个文件夹中,其中还有 build 文件夹和另一个名为“external”的文件夹,其中所需的库位于其中,每个文件夹都位于各自的子目录中。项目文件夹中有一个 CMakeLists.txt,“external”中有另一个 CMakeLists.txt 文件——我们称它们为 CMake1 和 CMake2

现在是 CMake1

cmake_minimum_required(VERSION 3.12)
project(PhysicsSimulation)
set(CMAKE_CXX_STANDARD 14)

###############################################################################

add_subdirectory(${CMAKE_SOURCE_DIR}/external)

# On Visual 2005 and above,this module can set the debug working directory
#cmake_policy(SET CMP0026 OLD)
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/external/rpavlik-cmake-modules-fe2273")
include(CreateLaunchers)
include(MSVCMultipleProcessCompile) # /MP

###############################################################################
    

add_executable(PhysicsSimulation
    main.cpp
    camera.h
    plane.h plane.cpp
    shader.h
    sphere.h
    mesh.h
    Integrator.h
    physys.h physys.cpp
    Integrator.cpp
    object_collision.h
    debugger.h
    debugger.cpp
    ./glm-aabb/AABB.hpp
    ./glm-aabb/AABB.cpp glm-aabb/AABB_tree.h glm-aabb/AABB_tree.cpp
    tetra_intersect.h
    tetra_intersect_volume.h
    ${CMAKE_SOURCE_DIR}/external/glad_master/glad.c 
)

# add_library( qhull STATIC
    # ${CMAKE_CURRENT_SOURCE_DIR}/qhull/src/libqhullcpp/Qhull.cpp
    # ${CMAKE_CURRENT_SOURCE_DIR}/qhull/src/libqhullcpp/Qhull.h
# )

target_include_directories(PhysicsSimulation PUBLIC 
    ${CMAKE_SOURCE_DIR}/external
    ${CMAKE_SOURCE_DIR}/external/qhull/src
    ${CMAKE_SOURCE_DIR}/external/qhull/src/libqhullcpp
    ${CMAKE_SOURCE_DIR}/external/qhull/src/libqhull_r
    ${CMAKE_SOURCE_DIR}/external/glad_master
    ${CMAKE_SOURCE_DIR}/external/glfw-3.2.1/include/GLFW/
    ${CMAKE_SOURCE_DIR}/external/glew-1.13.0/include/src
)
# target_link_directories(PhysicsSimulation PUBLIC 
    # ${CMAKE_SOURCE_DIR}/external/glad_master
    # glfw-3.2.1/include/GLFW/
    # glew-1.13.0/include/
# )

target_link_libraries(PhysicsSimulation
    ${OPENGL_LIBRARY}
    ${glfw}
    ${GLEW_1130}
    ${glad}
    ${qhull}
)

这里是 Cmake2

if(MSVC AND NOT "${MSVC_VERSION}" LESS 1400)
    add_deFinitions( "/MP" )
endif()


add_deFinitions(
    -DTW_STATIC
    -DTW_NO_LIB_PRAGMA
    -DTW_NO_DIRECT3D
    -DGLEW_STATIC
    -D_CRT_SECURE_NO_WARNINGS
)

### GLFW ###

add_subdirectory(glfw-3.2.1)

include_directories(
    glfw-3.2.1/include/GLFW/
    glew-1.13.0/include/
)

if(${CMAKE_SYstem_NAME} MATCHES "Linux")
set(OPENGL_LIBRARY
    ${OPENGL_LIBRARY}
    -lGL -lglu -lXrandr -lXext -lX11 -lrt
    ${CMAKE_DL_LIBS}
    ${GLFW_LIBRARIES}
)
elseif(${CMAKE_SYstem_NAME} MATCHES "Darwin")
set(OPENGL_LIBRARY
    ${OPENGL_LIBRARY}
    ${CMAKE_DL_LIBS}
    ${GLFW_LIBRARIES}
)
endif(${CMAKE_SYstem_NAME} MATCHES "Linux")


### GLEW ### -> I think it's ready 

add_library( GLEW_1130 STATIC
    ${CMAKE_CURRENT_SOURCE_DIR}/glew-1.13.0/src/glew.c
)

target_link_libraries(GLEW_1130
    ${OPENGL_LIBRARY}
    ${EXTRA_LIBS}
)

set_target_properties(GLEW_1130
    PROPERTIES
    PROJECT_LABEL glew_1130
    FOLDER "Libraries"
)

### SOIL ###

#add_subdirectory(Simple-OpenGL-Image-Library)

### GLAD ### -> supposedly ready
#add_subdirectory(glad_master)


add_library( glad STATIC
    ${CMAKE_CURRENT_SOURCE_DIR}/glad_master/glad.c
    ${CMAKE_CURRENT_SOURCE_DIR}/glad_master/glad.h
)

target_include_directories(glad PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/glad_master)

target_link_libraries(glad
    ${OPENGL_LIBRARY}
    ${EXTRA_LIBS}
)

set_target_properties(glad
    PROPERTIES
    PROJECT_LABEL glad
    FOLDER "Libraries"
)

target_include_directories(glad 
    PUBLIC ${CMAKE_SOURCE_DIR}/external/glad_master
)
target_link_directories(glad 
    PUBLIC ${CMAKE_SOURCE_DIR}/external/glad_master
)
# target_link_libraries(glad 
    # PUBLIC ${OPENGL_LIBRARY}
# )

### qhull ### -> I may need to include and link more directories
#add_subdirectory(qhull)

add_library( qhull STATIC
    ${CMAKE_CURRENT_SOURCE_DIR}/qhull/src/libqhullcpp/Qhull.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/qhull/src/libqhullcpp/Qhull.h
)

set_target_properties(qhull
    PROPERTIES
    PROJECT_LABEL qhull
    FOLDER "Libraries"
)

target_include_directories(qhull PUBLIC
    ${CMAKE_CURRENT_SOURCE_DIR}/qhull/src
    #${CURRENT_SOURCE_DIR}/qhull/src/libqhull_r
    #${CURRENT_SOURCE_DIR}/qhull/src/libqhallcpp # ${CMAKE_SOURCE_DIR}/external/ removed from before qhull#PUBLIC qhull/src/libqhull_r
)
target_link_directories(qhull PUBLIC 
    ${CMAKE_CURRENT_SOURCE_DIR}/qhull/src
    #${CURRENT_SOURCE_DIR}/qhull/src/libqhallcpp # ${CMAKE_SOURCE_DIR}/external/ removed from before qhull
    #${CURRENT_SOURCE_DIR}/qhull/src/libqhull_r
    #qhull/src/qconvex
)

#message(${CMAKE_CURRENT_SOURCE_DIR})
#message(${CMAKE_SOURCE_DIR})

取消注释注释行要么根本没有区别(无论如何我都可以说),要么会导致其他错误,例如“无法构建库,因为它已经存在于目录中......”,但是我离开它们是因为我认为有人可能会为他们建议更好或更合适的用法,或者对我使用它们的方式进行更正。 此外,在 CMake1 的 add_executable 中包含“${CMAKE_SOURCE_DIR}/external/glad_master/glad.c”已经解决了一些更多未解析的外部符号,但理想情况下,如果我设法解决我的问题,它不应该存在。

任何帮助将不胜感激,我期待着答案。提前致谢,如果需要任何其他信息,请询问您需要什么,我很乐意为您提供。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...