我正在尝试使用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脚本,我没有被阻止。
答案 0 :(得分:0)
我很尴尬地说我的问题是libSDL2.a路径中的拼写错误的结果。虽然,@ Tsyvarev确实提出了一个很好的观点,我应该将SDL2链接为PRIVATE。我现在正试图解决SDL2中与库中的函数调用相关的链接器错误到MACOSX框架函数。我也可以发一个关于这个的问题,虽然我会尝试调试一段时间。
感谢所有想到这一点的人! 特别感谢@Tsyvarev:)
编辑 - 我通过将框架与我的可执行文件链接来解决链接器错误。一切都回到原来的样子