【问题标题】:C++ SDL on macosx without Xcode没有 Xcode 的 macosx 上的 C++ SDL
【发布时间】:2011-01-04 06:04:03
【问题描述】:

系统:黑色 Macbook 运行 Mac os X 10.5.5 (Leopard)

我想只使用 g++ 编译一个 SDL hello-world 应用程序。 Xcode 对 macintosh 很好,但我想要跨平台兼容性,所以我不会使用任何 coaca 框架(没有菜单、没有按钮等)。此外,将 Xcode 项目移植到其他操作系统听起来并不有趣。我将 SDL 下载并安装到 /Library/Frameworks 中。

最大的问题是:makefile 中有什么(假设源代码中只有一个 helloWorld.cpp 文件)。如果可能,我想避免修改 here 找到的 Helloworld 文件。

【问题讨论】:

    标签: c++ macos g++ sdl


    【解决方案1】:

    我自己花了一点时间才弄清楚这一点,只是我已经在使用 SDL 并且正在 Lion 上从 C 过渡到 C++。这里的问题不仅仅是makefile,它也可能是你的源文件......

    下载 SDL-版本.tar.gz

    解压并在提示符下运行

    ./configure --prefix=/home/user/SDL && make && make install
    

    假设所有内容都是实际构建的,您现在可以使用 sdl-config 通过执行以下命令来构建您的源代码:

    g++ Main.cpp -o Main `/home/user/SDL/sdl-config --cflags --libs` \
        -framework OpenGL -framework Cocoa
    

    相同
    g++ Main.cpp -o Main -I/home/user/SDL/include \
        -L/home/user/SDL/lib -lSDLmain -lSDL -framework OpenGL -framework Cocoa
    

    现在这里的关键是您正在使用 C++... 让 SDL 宏正确替换您的 main,您需要防止 C++ 编译器破坏您的 main 函数调用。为此,请声明您的主要内容,如下所示:

    extern "C" int main(int argc, char ** argv)
    {
    }
    

    如果您不包含 extern "C" 内容,C++ 将更改您的 main 函数的名称,SDL 将无法自动找到它。如果你不使用 int main(int argc, char ** argv) 函数签名,C++ 会抱怨类型不匹配......所以你必须逐字逐句。 (如果使用 GCC,则排除 extern "C" 部分)

    陈斯

    【讨论】:

    • +1 经过数小时的挫折后,这真的很有帮助,我得到了一个简单的 SDL 程序,可以用 g++-4.8 编译。
    【解决方案2】:

    试试这个:

    all: helloWorld
    
    helloWorld: helloWorld.o
        g++ -o helloWorld helloWorld.o `sdl-config --libs`
    
    helloWorld.o: helloWorld.cpp
        g++ -c `sdl-config --cflags` helloWorld.cpp

    sdl-config 是 SDL 安装中应该附带的一个工具,它在使用 SDL 进行编译时输出适当的编译器和链接器标志。

    【讨论】:

    • 安装只安装框架,不安装SDL config,在macintosh上安装sdl-config是晦涩难懂的。
    • @Kevin Kostlan:对不起,我以为你已经安装了 Unix 风格。如果你想让你的构建过程更便携,你可能仍然想要。我认为使用框架你可以编译 g++ helloWorld.cpp -framework SDL -framework Cocoa
    • -框架也不起作用。我也直接编译了sdl(./configure; make; make install)但是不知道如何正确设置path等环境变量(所以还是报config不识别)。
    • 我认为它只是将 sdl-config 脚本留在源目录中。至于路径变量, make install 应该默认将库放在你的库路径中。 g++ helloWorld.cpp -lSDLmain -lSDL -framework Cocoa 怎么样?如果找不到库,请尝试添加标志 -L/usr/lib 或放置已编译的 sdl 库的任何位置。
    最近更新 更多