2011-11-15 216 views
2

我想在我的Mac上编译一个cmake项目,但它取决于SDL框架。我安装这个框架之后的cmake然后向我报告libSDL没有找到我设置以下导出变量自己(由CMake的的建议):libSDL,CMake和Mac OS X Lion

export SDL_INCLUDE_DIR=/Library/Frameworks/SDL.framework/ 
export SDLIMAGE_LIBRARY=/Library/Frameworks/SDL_image.framework/ 
export SDLIMAGE_INCLUDE_DIR=/Library/Frameworks/SDL_image.framework/Headers 

现在cmake的做它的工作,但是当我运行make,我得到的以下消息:

Mats-MBP:build mats$ make 
Linking CXX executable SDLExample 
Undefined symbols for architecture i386: 
"_main", referenced from: 
    start in crt1.10.6.o 
    (maybe you meant: _SDL_main) 
ld: symbol(s) not found for architecture i386 
collect2: ld returned 1 exit status 
make[2]: *** [src/SDLExample] Error 1 
make[1]: *** [src/CMakeFiles/SDLExample.dir/all] Error 2 
make: *** [all] Error 2 

我得到这对于i386和x86_64。我忘了什么?

编辑:这些文件的内容:

Mats-MBP:build mats$ cat ../src/main.cpp 
/** 
* @file main.cpp 
* 
* A simple example-program to help you out with using SDL for 2D graphics. 
* 
* @author przemek 
*/ 

#include <iostream> 
#include <stdexcept> 
#include <SDL.h> 
#include <SDL_image.h> 

using namespace std; 

int main(int argc, char* argv[]) { 
    try { 
     // Try to initialize SDL (for video) 
     if (SDL_Init(SDL_INIT_VIDEO) != 0) { 
      throw runtime_error("Couldn't init SDL video!"); 
     } 
     // Create a double-buffered screen surface: 
     SDL_Surface* screen = SDL_SetVideoMode(800, 600, 24, SDL_DOUBLEBUF/* |  SDL_FULLSCREEN*/); 
     if (!screen) { 
      throw runtime_error("Couldn't set SDL video mode!"); 
     } 

     // Use SDL_image library to load an image: 
     SDL_Surface* image = IMG_Load("image.png"); 
//  SDL_Surface* image = IMG_Load("image.tga"); 
     if (!image) { 
      throw runtime_error(SDL_GetError()); 
     } 

     // "Pump" SDL events like keyboard presses and get the keystate: 
     SDL_PumpEvents(); 
     Uint8* keyState = SDL_GetKeyState(0); 

     // loop until user presses escape: 
     while (!keyState[SDLK_ESCAPE]) { 
      // Display a game background: 
     SDL_Rect src, dst;   // Source and destination rectangles 
     src.x = 0; 
     src.y = 0; 
     src.w = image->w; 
     src.h = image->h; 
     dst.x = 100; 
     dst.y = 50; 
     dst.w = image->w; 
     dst.h = image->h; 
     // Copy the image from 'image' to 'screen' surface 
     SDL_BlitSurface(image, &src, SDL_GetVideoSurface(), &dst); 

     // Flip surfaces (remember: double-buffering!) and clear the back buffer: 
     SDL_Flip(screen); 
     SDL_FillRect(screen, 0, 0); 

     // Get new keyboard state: 
     SDL_PumpEvents(); 
     keyState = SDL_GetKeyState(0); 
    } 

    // Free the screen surface & quit SDL 
    SDL_FreeSurface(screen); 
    SDL_Quit(); 
} catch (runtime_error& e) { 
    cout << e.what() << endl; 
    SDL_Quit(); 
} 

return 0; 
} 
+1

你想建立什么样的事情?一个应用程序或命令行工具或其他东西? CMake抱怨缺少一个'main'函数。 –

+0

这是做抱怨,但那是关于同样的事情。我试图编译一个SDL示例程序,所以我想这将是一个命令行工具。 (为了记录,我确实有一个主要功能,并且我看不到任何其他主要功能的调用。) – Mats

+0

查看该示例代码,看看是否定义了任何“主要”功能。如果没有,创建一个(并确保它分支/跳转到示例代码的真正入口点)。 –

回答

1

我解决它通过消除.framework并取消我的出口变量这个框架,我用源的./configure,make,进行安装。我删除了所有的cmake构建文件,并重新创建了我的项目,一切都解决了。

(有关OS X Lion中编译SDL需要./configure --disable-assembly

0

正如雷蒙说,你需要链接到SDLmain.lib许多平台。所以在你的CMakeLists.txt文件中有这样的东西。

link_libraries (
    ${SDL_LIBRARY} 
    ${SDLIMAGE_LIBRARY} # if using SDL_image, obviously 
    SDLmain # Sadly not included in SDL_LIBRARY variable 
) 

下面是详细信息的简单页面:http://content.gpwiki.org/index.php/SDL:Tutorials:Setup