Неразрешенная внешняя ошибка символа (LNK2019) после включения заголовков - PullRequest
3 голосов
/ 02 апреля 2012

Я знаю, что об этом спрашивали, наверное, тысячу раз, но я уже несколько дней грызу ногти на этом.Я довольно новичок в C ++, и я впервые использую Visual Studio.

Я пытаюсь модифицировать гоночный симулятор TORCS для соревнований в моем университете.Большая часть этого уже сделана, поэтому только часть того, что я публикую, на самом деле является моим кодом.Но я добавил несколько новых функций, и у меня возникли проблемы с ними.

Все это прекрасно работало в Linux с g ++, но когда я пытаюсь скомпилировать его в Visual Studio 2005, я получаю неразрешенную внешнюю ошибку символа.

Я добавил новый проект в Solution,который использует функции из других проектов.

В этом новом проекте я вызываю функцию:

getisDerbyDuel()

, которая объявлена ​​в raceinit.h, которую я включил в новый проект.

#ifndef _RACEINIT_H_
#define _RACEINIT_H_

#define RACE_ENG_CFG    "config/raceengine.xml"

extern void ReInit(void);
extern void ReShutdown(void);
extern void ReStartNewRace(void * /* dummy */);
extern void ReAddRacemanListButton(void *menuHandle);
extern int  ReInitCars(void);
extern int  ReInitTrack(void);
extern void ReRaceCleanup(void);
extern void ReRaceCleanDrivers(void);
extern char *ReGetCurrentRaceName(void);
extern char *ReGetPrevRaceName(void);
extern bool getisDerbyDuel(void);
extern void setisDerbyDuel(bool isDerbyDuel);

extern tModList *ReRaceModList;

#endif /* _RACEINIT_H_ */

и определено в raceinit.cpp:

 bool _isDerbyDuel = true;

void setisDerbyDuel(bool isDerbyDuel) {
    _isDerbyDuel = isDerbyDuel;
}
bool getisDerbyDuel(void) {
    return _isDerbyDuel;
}

raceinit.h и raceinit.cpp находятся в разных проектах в моем решении под названием клиент, который компилируется без ошибок.Я также добавил client.lib к зависимостям в моем проекте.

При компиляции я получаю следующий вывод:

1>Generating Code... 
1>Compiling resources...
1>Linking...
1>   Creating library .\Release/championship2010server.lib and object      .\Release/championship2010server.exp
1>championship2010server.obj : error LNK2019: unresolved external symbol "bool __cdecl     getisDerbyDuel(void)" (?getisDerbyDuel@@YA_NXZ) referenced in function "void     __cdecl drive(int,struct CarElt *,struct Situation *)"     (?drive@@YAXHPAUCarElt@@PAUSituation@@@Z)
1>.\Release/championship2010server.dll : fatal error LNK1120: 1 unresolved externals
1>Build log was saved at "file://c:\Users\Administrator\Desktop\torcs-verylasttry    \src\drivers\championship2012server\Release\BuildLog.htm"
1>championship2010server - 2 error(s), 9 warning(s)
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========    

Любые идеи приветствуются, я не знаю, что попробовать.


РЕДАКТИРОВАТЬ:

Спасибо за ваши ответы.Я попытался изменить внешний элемент, поэтому сам флаг объявлен как внешний в заголовочном файле, а метод получения - нет (и несколько комбинаций), но, похоже, ничто не меняет вывод ошибки.

Я не совсем уверен, чтоподразумевается экспорт функций.Быстрый поиск в Google привел меня к этому:

[..]
extern void ReRaceCleanDrivers(void);
extern char *ReGetCurrentRaceName(void);
extern char *ReGetPrevRaceName(void);
#ifdef __cplusplus
extern "C" {  // only need to export C interface if
              // used by C++ source code
#endif
extern bool __declspec( dllimport ) getisDerbyDuel(void);
extern void __declspec( dllimport ) setisDerbyDuel(bool isDerbyDuel);

#ifdef __cplusplus
}
#endif
extern bool _isDerbyDuel;
[...]

и

extern "C" {
#include <raceinit.h>
}

Что изменило ошибку Вывод на это:

1>championship2010server.obj : error LNK2019: unresolved external symbol     __imp__getisDerbyDuel referenced in function "void __cdecl drive(int,struct CarElt *,struct     Situation *)" (?drive@@YAXHPAUCarElt@@PAUSituation@@@Z)
1>.\Release/championship2010server.dll : fatal error LNK1120: 1 unresolved externals

Я просто незнать, что здесь не так.


РЕДАКТИРОВАТЬ ВТОРОЕ:

Итак, после прочтения о функциях импорта / экспорта я скорректировал свой код.
Файл заголовка, где находится неразрешенная функцияобъявленный сейчас выглядит следующим образом:

#ifdef __cplusplus
extern "C" {  // only need to export C interface if
              // used by C++ source code
#endif
 __declspec( dllexport ) bool getisDerbyDuel(void);
 __declspec( dllexport ) void setisDerbyDuel(bool isDerbyDuel);

#ifdef __cplusplus
}
#endif
extern bool _isDerbyDuel;

Файл, в котором я вызываю функцию, не имеет файла заголовка, но я попытался объявить импортированную функцию в соответствии с другими функциями в файле:

[...]
static tTrack *curTrack;
static int RESTARTING[NBBOTS];

static void initTrack(int index, tTrack* track, void *carHandle,
        void **carParmHandle, tSituation *s);
static void newrace(int index, tCarElt* car, tSituation *s);
extern "C" void drive(int index, tCarElt* car, tSituation *s);
static void endrace(int index, tCarElt *car, tSituation *s);
static void shutdown(int index);
static int InitFuncPt(int index, void *pt);

__declspec( dllimport ) bool getisDerbyDuel(void);
[...]

Заголовок включен, как и любой другой, и функция вызывается так:

if (getisDerbyDuel()) {
[...]

Теперь вывод ошибки изменился на:

error LNK2019: unresolved external symbol _getisDerbyDuel referenced in function _drive

Так чтоМне кажется, что если я только что решил проблему совместимости с C / C ++ (или сделал ее еще хуже, я даже больше не уверен), но проблема компоновщика осталась неизменной.

Есть идеи?Сейчас я немного откладываю, но мне нужно, чтобы это сработало, иначе мой босс разозлится:)

Ответы [ 2 ]

6 голосов
/ 04 апреля 2012

Как я уже сказал, я новичок в Visual Studio, но это все еще немного смущает.Я обнаружил свою ошибку, и ее на самом деле не было в моем коде.
В дополнение к вводу компоновщика и т. Д. Мне пришлось добавить проект, содержащий raceinit.cpp, к ссылкам в моем новом проекте.Это решило мою проблему.

3 голосов
/ 02 апреля 2012

Visual Studio использует другой метод для включения путей и связывания lib.

Проверьте настройки вашего проекта:

  1. щелкните правой кнопкой мыши свой проект и выберите «Настройки»
  2. в разделе «Свойства конфигурации» установите флажок «C / C ++», который у вас есть. добавили пути к нужным заголовкам
  3. Теперь проверьте под 'Linker', что вы добавили путь к вашему lib-файлу под 'Additional Библиотечные каталоги '
  4. Также проверьте, что вы добавили библиотеку в «Linker> Input> Additional Dependencies»

Надеюсь, вышеизложенное поможет.

...