Ошибка при использовании 'extern' - неразрешенный внешний символ - PullRequest
2 голосов
/ 22 декабря 2009

При компиляции я получил следующее сообщение об ошибке, но я уверен, что переменные объявлены во внешнем файле Project2.c. Может ли кто-нибудь дать мне подсказку, что я сделал не так? Спасибо

1>main.obj : error LNK2001: unresolved external symbol _num_days
1>main.obj : error LNK2019: unresolved external symbol _countDays referenced in function _testIt
1>main.obj : error LNK2001: unresolved external symbol _what_birthday
1>main.obj : error LNK2001: unresolved external symbol _birth_day
1>main.obj : error LNK2001: unresolved external symbol _birth_month
1>main.obj : error LNK2001: unresolved external symbol _birth_year

Исходный код:

#include <stdio.h>

/* the following five variables are defined inside project2.c */
extern int birth_year; 
extern int birth_month;
extern int birth_day;
extern int what_birthday;
extern int num_days;

void countDays(void); // a declaration of your function

int num_tests_passed = 0;

void testIt(int test_num, 
        int year, int month, int day, int bday, int expected) {
    birth_year = year;
    birth_month = month;
    birth_day = day;
    what_birthday = bday;
    countDays();
    printf("your answer to test %d was %d, should have been %d\n", 
        test_num, num_days, expected);

    /* check the correctness and quality of their solution */
    if (num_days == expected) {
        if ((birth_year == year) && (birth_month == month) 
                && (birth_day == day)) {
            num_tests_passed += 1;
        } else {
            printf("you got the answer correct,"
                "but you don't follow instructions very well\n");
        }
    } else {
        printf("oops.\n");
    }
}


int main(void) {
    /* test #1: Born Feb 4, 1964 and about to turn 41 */
    testIt(1, 1964, 2, 4, 41, 41 * 365 + 11); // feb 29ths in '64, 68, 72,
                            // 76, 80, 84, 88, 92, 96, 00, and 04 (11 days)

    /* test #2: Born Jan 22, 1998 and about to turn 2 */
    testIt(2, 1998, 1, 22, 2, 2 * 365); // no leap days

    /* test #3: Born March 22, 1998 and about to turn 2 */
    testIt(3, 1998, 3, 22, 2, 2 * 365 + 1); // feb 29, 2000

    /* test #4: Born March 22, 1898 and about to turn 2 */
    testIt(4, 1898, 3, 22, 2, 2 * 365); // no leap days

    /* test #5: Born Jan 22, 1996 and about to turn 4 */
    testIt(5, 1996, 1, 22, 4, 4 * 365 + 1); // feb 29, 1996

    /* test #6: Born March 22, 1996 and about to turn 4 */
    testIt(6, 1996, 3, 22, 4, 4 * 365 + 1); // feb 29, 2000

    /* test #7: Born March 22, 1796 and about to turn 4 */
    testIt(7, 1796, 3, 22, 4, 365 * 4); // no leap days

    /* test #8: Born Jan 1, 1800 and about to turn 101 */
    testIt(8, 1800, 1, 1, 101, 101 * 365 + 24); // There are 26 years divisible by 4
                    // between 1800 and 1901, all of these except 1800 and 1900 are leap years
                    // so there are 24 leap days
    /* test #9: born Jan 1, 1900 and about to turn 100 */
    testIt(9, 1900, 1, 1, 100, 100 * 365 + 24); // 26 years divisible by 4
                    // 1900 was not a leap year, and the 100th brithday comes
                    // before Feb 29, 2000, so only 24 leap days.


    if (num_tests_passed == 9) {
        printf("all tests passed successfully.  Well done!\n");
    } else {
        printf("you only passed %d of the 9 tests.  Looks like you've got some work to do\n",
            num_tests_passed);
    }
}

1 Ответ

8 голосов
/ 22 декабря 2009

В вашем project2.c убедитесь, что вы определили эти переменные и что файл действительно является частью вашего решения. Если исходный файл опущен, чем понятно, компоновщик будет жаловаться, так как не смог найти определения.

Обычно рекомендуется помещать эти переменные в заголовочный файл и определять.

Для упрощенного примера, назовите этот заголовочный файл project2.h:

/* project2.h */
extern int birth_year; 
extern int birth_month;
extern int birth_day;
extern int what_birthday;
extern int num_days;

Здесь, чтобы следовать примеру, приведем ваш код с переменными extern, вместо которых вместо #include. Давайте также дадим этому файлу имя с именем myproject1.c

#include <stdio.h>
#include "project2.h"

void countDays(void); // a declaration of your function

int num_tests_passed = 0;

void testIt(int test_num, 
        int year, int month, int day, int bday, int expected) {
    birth_year = year;
    birth_month = month;
    birth_day = day;
    what_birthday = bday;
    countDays();
    printf("your answer to test %d was %d, should have been %d\n", 
        test_num, num_days, expected);

    /* check the correctness and quality of their solution */
    if (num_days == expected) {
        if ((birth_year == year) && (birth_month == month) 
                        && (birth_day == day)) {
                num_tests_passed += 1;
        } else {
                printf("you got the answer correct,"
                        "but you don't follow instructions very well\n");
        }
    } else {
        printf("oops.\n");
    }
}


int main(void) {
    /* test #1: Born Feb 4, 1964 and about to turn 41 */
    testIt(1, 1964, 2, 4, 41, 41 * 365 + 11); // feb 29ths in '64, 68, 72,
                                                // 76, 80, 84, 88, 92, 96, 00, and 04 (11 days)

    /* test #2: Born Jan 22, 1998 and about to turn 2 */
    testIt(2, 1998, 1, 22, 2, 2 * 365); // no leap days

    /* test #3: Born March 22, 1998 and about to turn 2 */
    testIt(3, 1998, 3, 22, 2, 2 * 365 + 1); // feb 29, 2000

    /* test #4: Born March 22, 1898 and about to turn 2 */
    testIt(4, 1898, 3, 22, 2, 2 * 365); // no leap days

    /* test #5: Born Jan 22, 1996 and about to turn 4 */
    testIt(5, 1996, 1, 22, 4, 4 * 365 + 1); // feb 29, 1996

    /* test #6: Born March 22, 1996 and about to turn 4 */
    testIt(6, 1996, 3, 22, 4, 4 * 365 + 1); // feb 29, 2000

    /* test #7: Born March 22, 1796 and about to turn 4 */
    testIt(7, 1796, 3, 22, 4, 365 * 4); // no leap days

    /* test #8: Born Jan 1, 1800 and about to turn 101 */
    testIt(8, 1800, 1, 1, 101, 101 * 365 + 24); // There are 26 years divisible by 4
                                // between 1800 and 1901, all of these except 1800 and 1900 are leap years
                                // so there are 24 leap days
    /* test #9: born Jan 1, 1900 and about to turn 100 */
    testIt(9, 1900, 1, 1, 100, 100 * 365 + 24); // 26 years divisible by 4
                                // 1900 was not a leap year, and the 100th brithday comes
                                // before Feb 29, 2000, so only 24 leap days.


    if (num_tests_passed == 9) {
        printf("all tests passed successfully.  Well done!\n");
    } else {
        printf("you only passed %d of the 9 tests.  Looks like you've got some work to do\n",
                num_tests_passed);
    }
}

Тогда в project2.c вы бы сделали это

/* ... */
int birth_year; 
int birth_month;
int birth_day;
int what_birthday;
int num_days;

/* functions... */

И что ваше решение составляет

  • project2.h
  • myproject1.c
  • project2.c

Затем проект должен компилироваться без ошибок компоновщика.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...