在CMake中导入静态第三方(SDL2)库

时间:2017-03-26 22:25:47

标签: c++ macos cmake sdl

我正在尝试使用CMake(3.5.2)开始一个项目。对于我的项目,我想使用SDL2。到目前为止,这是文件夹层次结构。

PROJECT
├── Applications
├── External
│   └── SDL2
├── Games
├── Libraries
│   └── Rendering
└── Tests
    └── Testen

我正在处理的渲染库依赖于SDL2,而Testen依赖于SDL2。我为每个平台构建了SDL2作为静态库,在我尝试将SDL2导入到我的CMake项目之前,我有一个基于控制台的测试应用程序处于工作状态。在尝试添加它之后,我感到难过......

:-1: error: No rule to make target /**FULL_PATH_TO_PROJECT_DIR**/External/SDL2/SDL2-2.0.5/Xcode/SDL/Build/libSDL2.a, needed by `Tests/Testen/Testen.app/Contents/MacOS/Testen'.  Stop.

以下是SDL2的CMake列表

SET (SDL2_NAME "External::SDL2")
SET (SDL2_LIBRARY "***ABSOLUTE_PATH_TO_LIBRARY***")
SET (SDL2_LIBRARY_DIR "***ABSOLUTE_PATH_TO_LIBRARY_DIR***")
SET (SDL2_INCLUDE_DIR "***ABSOLUTE_PATH_TO_SDL2_INCLUDES***")

LINK_DIRECTORIES( "${SDL2_LIBRARY_DIR}" )

ADD_LIBRARY ( 
    ${SDL2_NAME}

    STATIC
    IMPORTED
    GLOBAL
)

SET_TARGET_PROPERTIES (
    ${SDL2_NAME}

    PROPERTIES

    IMPORTED_LOCATION ${SDL2_LIBRARY}
    LINK_DIRECTORIES ${SDL2_LIBRARY_DIR}
    INTERFACE_INCLUDE_DIRECTORIES ${SDL2_INCLUDE_DIR}
)

以下是渲染包装器库的CMake列表

SET ( LIBRARY_NAME Rendering)

SET (   
    HEADERS

    Header1.h
    Header2.h
    Header3.h
    Header4.h
)


SET (   
    SOURCE

    Source1.cpp
    Source2.cpp
    Source3.cpp
    Source4.cpp
)


SET (
    LIB_DEPENDENCIES

    SomeOtherLibraryWrittenByMe
)

LINK_DIRECTORIES( "${***ABSOLUTE_PATH_TO_SDL2_LIBRARY_DIR***}" )

ADD_LIBRARY (
    ${LIBRARY_NAME}

    ${SOURCE}
    ${HEADERS}
)

ADD_DEPENDENCIES (
    ${LIBRARY_NAME}

    ${LIB_DEPENDENCIES}
)

TARGET_LINK_LIBRARIES (
    ${LIBRARY_NAME}

    ${LIB_DEPENDENCIES}
    External::SDL2
)

以下是Testen(我的测试应用程序)的CMake列表

SET ( APP_NAME Testen)
SET ( APP_HEADERS ***SAME_STYLE_AS_RENDERING***)
SET ( APP_SOURCE ***SAME_STYLE_AS_RENDERING***)

LINK_DIRECTORIES( "${***ABSOLUTE_PATH_TO_SDL2_LIBRARY_DIR***}" )

# Here we put together our executable
ADD_EXECUTABLE ( 
    ${APP_NAME}

    MACOSX_BUNDLE # Because I'm on a mac right now

    ${APP_HEADERS}
    ${APP_SOURCE}
)


ADD_DEPENDENCIES ( 
    ${APP_NAME}

    Rendering
)

TARGET_LINK_LIBRARIES (
    ${APP_NAME}

    Rendering
)

我的项目的目标是更多地了解编程的不同方面。也就是说,我正在积极避免使用像FindSDL2.cmake这样的辅助脚本和其他类似的模块。也许这可能是解决我的问题所需要的工具,但如果我试图在我的项目中添加一些东西,那么我想确切地知道它是做什么的。 .cmake脚本,我没有被阻止。

1 个答案:

答案 0 :(得分:0)

我很尴尬地说我的问题是libSDL2.a路径中的拼写错误的结果。虽然,@ Tsyvarev确实提出了一个很好的观点,我应该将SDL2链接为PRIVATE。我现在正试图解决SDL2中与库中的函数调用相关的链接器错误到MACOSX框架函数。我也可以发一个关于这个的问题,虽然我会尝试调试一段时间。

感谢所有想到这一点的人! 特别感谢@Tsyvarev:)

编辑 - 我通过将框架与我的可执行文件链接来解决链接器错误。一切都回到原来的样子