我有一个简单的项目,我试图使用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文件中删除苹果特定代码,它甚至不构建.
我该如何解决这个问题?
在CMakeLists.txt [3]中,您缺少:
TARGET_LINK_LIBRARIES(game ${SDL2_LIBRARY})
Run Code Online (Sandbox Code Playgroud)
或者您可以将$ {SDL2_LIBRARY}附加到您在CMakeLists.txt [2]中的TARGET_LINK_LIBRARIES电话中...
| 归档时间: |
|
| 查看次数: |
611 次 |
| 最近记录: |