c++ - CMake FIND_LIBRARY 适用于 Windows 但不适用于 OS X

标签 c++ cmake cmake-gui

在 Windows 中的 Cmake 上运行相同的代码可以找到库,但在 Mac 上找不到它们。代码可以找到 Include 目录,但找不到库

这是 Cmake 输出的屏幕 enter image description here

这是目录结构的屏幕 enter image description here

这里是CMakeLists.txt

cmake_minimum_required(VERSION 2.6)

project (GameCreatorEngine)

# version can be passed into the application from CMake TODO

set(cmake_test_VERSION_MAJOR 1)
set(cmake_test_VERSION_MINOR 3)

# compiler flags

add_definitions(
    -c
    -W4
)

# SDL LIB INCLUDES

SET( SDL2_SEARCH_PATHS
    ${SDL2_ROOT_DIR}                
    ./res/lib/SDL2
)

FIND_PATH( SDL2_INCLUDE_DIRS
    NAMES
        SDL.h SDL2/SDL.h
    PATHS
        ${SDL2_SEARCH_PATHS}
    PATH_SUFFIXES
        include
)

FIND_LIBRARY( SDL2
    NAMES
        SDL2.lib 
    PATHS
        ${SDL2_SEARCH_PATHS}
    PATH_SUFFIXES
        lib
)

FIND_LIBRARY( SDL2_MAIN
    NAMES
        SDL2main.lib 
    PATHS
        ${SDL2_SEARCH_PATHS}
    PATH_SUFFIXES
        lib
)

IF ( SDL2_INCLUDE_DIRS AND SDL2_MAIN AND SDL2)
    SET( SDL2_FOUND TRUE )
    MESSAGE(STATUS "Looking for SDL2 - found")
ELSE ( SDL2_INCLUDE_DIRS AND SDL2_MAIN AND SDL2 )
    SET( SDL2_FOUND FALSE )
    MESSAGE(STATUS "Looking for SDL2 - not found")
ENDIF ( SDL2_INCLUDE_DIRS AND SDL2_MAIN AND SDL2 )

# GLEW LIB INCLUDES

SET(GLEW_SEARCH_PATHS
    ${GLEW_ROOT_DIR}                
    ./res/lib/GLEW
)

FIND_PATH( GLEW_INCLUDE_DIRS
    NAMES
        glew.h
    PATHS
        ${GLEW_SEARCH_PATHS}
    PATH_SUFFIXES
        include
)

FIND_LIBRARY( GLEW_LIBRARIES
    NAMES
        glew32
    PATHS
        ${GLEW_SEARCH_PATHS}
    PATH_SUFFIXES
        lib/Release/Win32
)

IF ( GLEW_INCLUDE_DIRS AND GLEW_LIBRARIES )
    SET( GLEW_FOUND TRUE )
    MESSAGE( STATUS "Looking for GLEW - found" )
ELSE ( GLEW_INCLUDE_DIRS AND GLEW_LIBRARIES )
    SET( GLEW_FOUND FALSE )
    MESSAGE( STATUS "Looking for GLEW - not found" )
ENDIF ( GLEW_INCLUDE_DIRS AND GLEW_LIBRARIES )

# ASSIMP 

SET(ASSIMP_SEARCH_PATHS
    ${ASSIMP_ROOT_DIR}              
    ./res/lib/assimp
)

FIND_PATH( ASSIMP_INCLUDE_DIRS
    NAMES
        mesh.h
    PATHS
        ${ASSIMP_SEARCH_PATHS}
    PATH_SUFFIXES
        include
)

FIND_LIBRARY( ASSIMP_LIBRARIES
    NAMES
        assimp ASSIMP
    PATHS
        ${ASSIMP_SEARCH_PATHS}
    PATH_SUFFIXES
        lib
        lib/x86 
        lib/x64
)

IF ( ASSIMP_INCLUDE_DIRS AND ASSIMP_LIBRARIES )
    SET( ASSIMP_FOUND TRUE )
    MESSAGE(STATUS "Looking for ASSIMP - found")
ELSE ( ASSIMP_INCLUDE_DIRS AND ASSIMP_LIBRARIES )
    SET( ASSIMP_FOUND FALSE )
    MESSAGE(STATUS "Looking for ASSIMP - not found")
ENDIF ( ASSIMP_INCLUDE_DIRS AND ASSIMP_LIBRARIES )

# glm maths lib
SET( GLM_SEARCH_PATHS
    ${GLM_ROOT_DIR}             
    ./res/lib/glm
)

FIND_PATH( GLM_INCLUDE_DIRS
    NAMES
        glm.hpp
    PATHS
        ${GLM_SEARCH_PATHS}
    PATH_SUFFIXES
        include
)

IF ( GLM_INCLUDE_DIRS)
    SET( GLM_FOUND TRUE )
    MESSAGE(STATUS "Looking for GLM - found")
ELSE ( GLM_INCLUDE_DIRS )
    SET( ASSIMP_FOUND FALSE )
    MESSAGE(STATUS "Looking for GLM - not found")
ENDIF ( GLM_INCLUDE_DIRS )

# OpenGL
find_package(OpenGL REQUIRED)

# GameCreatorLibrary 
file(GLOB HDRS ${ENGINE_SOURCE_DIR}src/*.h)
file(GLOB SRCS ${ENGINE_SOURCE_DIR}src/*.cpp src/*.c)
add_executable(GameCreatorEngine ${HDRS} ${SRCS})

# Define the include DIRs
include_directories(
    ${SDL2_INCLUDE_DIRS}
    ${GLEW_INCLUDE_DIRS}
    ${ASSIMP_INCLUDE_DIRS}
    ${GLM_INCLUDE_DIRS}
    ${OPENGL_INCLUDE_DIRS}
    ${ENGINE_SOURCE_DIR}/headers
    ${ENGINE_SOURCE_DIR}/sources
)

# Define the link libraries
target_link_libraries( GameCreatorEngine
    ${SDL2}
    ${SDL2_MAIN}
    ${GLEW_LIBRARIES}
    ${ASSIMP_LIBRARIES}
    ${OPENGL_LIBRARIES}
)

最佳答案

库的正确文件扩展名因平台而异。虽然 .lib 用于 Windows 上的静态和 dll 导入库,但 OS X 使用不同的命名约定(.a 用于静态和 .so/.dylib 用于动态库,可能带有 lib 前缀)。

为了仍然允许代码使用所有这些不同的命名约定,find_library 希望您完全省略任何扩展名或前缀,只给出库的裸名.

因此,您应该只编写 find_library(SDL2 NAMES SDL2 [...]) 而不是 find_library(SDL2 NAMES SDL2.lib [...])

从你的问题来看,你似乎也在尝试将你的 OS X 构建链接到 Windows 二进制文件(.lib.dll 文件扩展名)。 这行不通。您需要一组单独的为 OS X 编译的二进制文件。

关于c++ - CMake FIND_LIBRARY 适用于 Windows 但不适用于 OS X,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26931872/

相关文章:

c++ - 在 cmake-gui 中修改变量

c++ - SFML - 为什么绘制到窗口的 Sprite 会随窗口缩放(调整大小)

c++ - 如何使用 C++11 type_traits 创建自定义元编程测试结构?

c++ - C++ 中的单位分隔符

c++ - 如何将模板化类作为默认模板类型传递给自己的类?

c++ - 如何在 Visual Studio 2008 中启用 SSE/SSE2 指令集(使用 CMake)?

build - 使用 CMake,我如何将 "install an alias"发送到库?

c++ - 如何将第三方库链接到 cmake 中的静态库目标?

cmake - 为什么 CLI 在一个命令中完成所有操作时 GUI 配置和生成中有两个按钮

linux - 使用软件 bam-window 软件的 cmake 错误