成功构建后,CMake没有正确链接文件

mr *_* oh 4 cmake

我有一个简单的项目,我试图使用cmake自动化构建.事情进行得很顺利,直到我遇到cmake构建过程的砖墙.我认为最好是向您展示整个项目.

project/
    CMakeLists.txt **[1]**
    build/
    source/
        CMakeLists.txt **[2]**
        main.c
        game/
        CMakeLists.txt **[3]**
        game.c
        game.h
Run Code Online (Sandbox Code Playgroud)

main.c中

#include <stdio.h>
#include “game/game.h"

int main(int argc, char const *argv[]) {

  initSdlAccel(480, 320, "this is a test");

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

game.h

#include <stdlib.h>
#include <string.h>
#include <SDL.h>
#include <SDL_image.h>
#include <SDL_ttf.h>
#include <SDL_mixer.h>

void initSdlAccel(int width, int height, const char *title);
Run Code Online (Sandbox Code Playgroud)

game.c

#include “game.h"

SDL_Window *window;
SDL_Renderer *renderer;

void initSdlAccel(int width, int height, const char *title)
{
  if (SDL_Init(SDL_INIT_EVERYTHING) != 0)
  {
    SDL_Log("sdl failed to init");
    SDL_Quit();
  }

  window = SDL_CreateWindow(title, 100, 100, width, height, SDL_WINDOW_SHOWN);
  if(window == NULL)
  {
    SDL_Log("sdl failed to create window");
    SDL_Quit();
  }

  renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
  if(window == NULL)
  {
    SDL_Log("sdl failed to create renderer");
    SDL_Quit();
  }
}
Run Code Online (Sandbox Code Playgroud)

的CMakeLists.txt [1]

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

PROJECT(game)

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

IF(APPLE)
   #SET(GUI_TYPE MACOSX_BUNDLE)
   SET(INCLUDE_DIRS /Library/Frameworks/SDL2.framework/Headers
                    /Library/Frameworks/SDL2_ttf.framework/Headers
                    /Library/Frameworks/SDL2_mixer.framework/Headers
                    /Library/Frameworks/SDL2_image.framework/Headers)
   INCLUDE_DIRECTORIES ( "${INCLUDE_DIRS}" )
   FIND_LIBRARY(SDL2_LIBRARY Sdl2)

   SET(EXTRA_LIBS ${Sdl2} )
   INCLUDE_DIRECTORIES("${INCLUDE_DIRS}")
ENDIF (APPLE)

ADD_SUBDIRECTORY(source)
ADD_SUBDIRECTORY(source/game)
Run Code Online (Sandbox Code Playgroud)

的CMakeLists.txt [2]

PROJECT(launcher)

SET(SRC_FILES main.c)

INCLUDE_DIRECTORIES("${PROJECT_BINARY_DIR}")

ADD_EXECUTABLE(launcher "${SRC_FILES}")
TARGET_LINK_LIBRARIES(launcher game)
Run Code Online (Sandbox Code Playgroud)

的CMakeLists.txt [3]

PROJECT(game)

SET(SRC_FILES game.c)

ADD_LIBRARY(game "${SRC_FILES}”)
Run Code Online (Sandbox Code Playgroud) #
Undefined symbols for architecture x86_64:
  "_SDL_Log", referenced from:
      _initSdlAccel in libgame.a(game.c.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [bin/launcher] Error 1
make[1]: *** [source/CMakeFiles/launcher.dir/all] Error 2
make: *** [all] Error 2
Run Code Online (Sandbox Code Playgroud)

这是一个非常简单或至少应该是非常简单的构建设置,但我无法让game.c文件实际使用包含的SDL文件.它们被正确找到,因为如果我从主CMakeLists文件中删除苹果特定代码,它甚至不构建.

我该如何解决这个问题?

DLR*_*ave 5

在CMakeLists.txt [3]中,您缺少:

TARGET_LINK_LIBRARIES(game ${SDL2_LIBRARY})
Run Code Online (Sandbox Code Playgroud)

或者您可以将$ {SDL2_LIBRARY}附加到您在CMakeLists.txt [2]中的TARGET_LINK_LIBRARIES电话中...