仅在Visual Studio中未解析的外部符号?

时间:2014-06-11 12:16:27

标签: c++ eclipse xcode visual-studio-2013 sdl

我是C ++编程的初学者(与PHP合作多年),并且在使用Visual Studio Express 2013编译一些在Xcode和Eclipse中都能正常运行的代码时遇到了一些麻烦。

所以设置就是这样。我的目标是使用SDL 2.0创建一款适用于手机和平板电脑的游戏。我正在使用Mac(使用VM for Windows),并且到目前为止已经成功地在Xcode和Eclipse中使用了初始测试项目。这两个项目都链接到使用Xcode创建的公共库(用于跨平台开发,因此我为所有平台编写一次代码)。我现在正在尝试添加适当的Visual Studio项目,以便我也可以为Windows 8 / WP8编译它。

按照说明here我已成功设法在该页面上进行基本测试,证明SDL在Windows 8中正常运行。但是,我现在正努力将我的公共库链接到Visual中的项目工作室,一直给我错误。首先是代码。

的main.cpp

#include "SDL.h"
#include "rectangles.h"
#include <time.h>

#define SCREEN_WIDTH 320
#define SCREEN_HEIGHT 480

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

    SDL_Window *window;
    SDL_Renderer *renderer;
    int done;
    SDL_Event event;

    /* initialize SDL */
    if (SDL_Init(SDL_INIT_VIDEO) < 0) {
        printf("Could not initialize SDL\n");
        return 1;
    }

    /* seed random number generator */
    srand(time(NULL));

    /* create window and renderer */
    window =
        SDL_CreateWindow(NULL, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT,
                         SDL_WINDOW_OPENGL);
    if (!window) {
        printf("Could not initialize Window\n");
        return 1;
    }

    renderer = SDL_CreateRenderer(window, -1, 0);
    if (!renderer) {
        printf("Could not create renderer\n");
        return 1;
    }

    Rectangles rectangles(SCREEN_WIDTH, SCREEN_HEIGHT);

    /* Enter render loop, waiting for user to quit */
    done = 0;
    while (!done) {
        while (SDL_PollEvent(&event)) {
            if (event.type == SDL_QUIT) {
                done = 1;
            }
        }


        rectangles.render(renderer);

        SDL_Delay(1);
    }

    /* shutdown SDL */
    SDL_Quit();

    return 0;
}

rectangles.h

#ifndef RECTANGLES_H
#define RECTANGLES_H

class Rectangles {
public:
    int screenWidth;
    int screenHeight;

    Rectangles(int width, int height);
    void render(SDL_Renderer *renderer);
    int randomInt(int min, int max);
};

#endif

rectangles.cpp

#include "SDL.h"
#include "Rectangles.h"

Rectangles::Rectangles(int width, int height)
{
    screenWidth = width;
    screenHeight = height;

    SDL_Log("Initializing rectangles!");
}

int Rectangles::randomInt(int min, int max)
{
    return min + rand() % (max - min + 1);
}

void Rectangles::render(SDL_Renderer *renderer)
{

    Uint8 r, g, b;

    /* Clear the screen */
    SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
    SDL_RenderClear(renderer);

    /*  Come up with a random rectangle */
    SDL_Rect rect;
    rect.w = randomInt(64, 128);
    rect.h = randomInt(64, 128);
    rect.x = randomInt(0, screenWidth);
    rect.y = randomInt(0, screenHeight);

    /* Come up with a random color */
    r = randomInt(50, 255);
    g = randomInt(50, 255);
    b = randomInt(50, 255);
    SDL_SetRenderDrawColor(renderer, r, g, b, 255);

    /*  Fill the rectangle in the color */
    SDL_RenderFillRect(renderer, &rect);

    /* update screen */
    SDL_RenderPresent(renderer);
}

我正在使用的代码稍微修改了使用SDL的教程。我将用于绘制矩形的部分从main.cpp中的函数移动到它们自己的类中。这在Xcode(iOS)和Eclipse(Android)中编译并运行良好。我将rectangles.h文件的位置添加到Visual Studio中的“其他包含目录”选项,但它提供了以下错误:

Error   2   error LNK2019: unresolved external symbol "public: __thiscall Rectangles::Rectangles(int,int)" (??0Rectangles@@QAE@HH@Z) referenced in function _SDL_main   Z:\Desktop\SDLWinRTApplication\SDLWinRTApplication\main.obj SDLWinRTApplication
Error   3   error LNK2019: unresolved external symbol "public: void __thiscall Rectangles::render(struct SDL_Renderer *)" (?render@Rectangles@@QAEXPAUSDL_Renderer@@@Z) referenced in function _SDL_main    Z:\Desktop\SDLWinRTApplication\SDLWinRTApplication\main.obj SDLWinRTApplication
Error   4   error LNK1120: 2 unresolved externals   Z:\Desktop\SDLWinRTApplication\Debug\SDLWinRTApplication\SDLWinRTApplication.exe    SDLWinRTApplication

我看了几个答案,表明我的代码出了问题,但我看不出我做错了什么?或者我需要在Visual Studio中进行额外的步骤才能使其正常工作?

最终目标是为每个平台设置单独的项目,调用实际“游戏”存在的公共库,这样我就不会为每个平台来回复制文件(之前询问过{{3} })。 非常感谢。

编辑: 根据建议,我已经尝试将rectangles.cpp文件再次添加到Visual Studio中的项目解决方案中。但是,然后我得到了以下错误,我无法做出头脑或尾巴。

Error   2   error LNK2038: mismatch detected for 'vccorlib_lib_should_be_specified_before_msvcrt_lib_to_linker': value '1' doesn't match value '0' in MSVCRTD.lib(appinit.obj)  Z:\Desktop\SDLWinRTApplication\SDLWinRTApplication\vccorlibd.lib(compiler.obj)  SDLWinRTApplication
Error   3   error LNK2005: ___crtWinrtInitType already defined in MSVCRTD.lib(appinit.obj)  Z:\Desktop\SDLWinRTApplication\SDLWinRTApplication\vccorlibd.lib(compiler.obj)  SDLWinRTApplication
Error   4   error LNK1169: one or more multiply defined symbols found   Z:\Desktop\SDLWinRTApplication\Debug\SDLWinRTApplication\SDLWinRTApplication.exe    SDLWinRTApplication

EDIT2: 如果我从“附加包含目录”中删除对rectangles.h位置的引用,并将rectangles.h与rectangles.cpp文件一起添加到项目解决方案中,那么我得到:

Error   1   error C1083: Cannot open include file: 'Rectangles.h': No such file or directory    z:\desktop\sdlwinrtapplication\sdlwinrtapplication\main.cpp 8   1   SDLWinRTApplication

根据问题here,Visual Studio在添加到项目根目录时应该能够找到头文件吗?

1 个答案:

答案 0 :(得分:0)

您必须通过向rectangles.h添加内容来“导出”Rectangle类的公共接口。说明位于此页面的“向动态链接库添加类”: https://msdn.microsoft.com/en-us/library/ms235636.aspx

还要确保所有内容都适用于同一平台;例如,所有x64或所有Win32。要查看解决方案中每个项目的平台,请右键单击解决方案,然后单击“配置属性”。