2015-03-06 4 views
1

Я нахожусь в середине кода переноса из Visual Studio в Mingw GCC. Этот компонент отлично работает в Visual Studio, однако Mingw GCC жалуется на неопределенную ссылку на функцию. Я изолировал ситуацию и кладу вниз код здесьНеопределенная ссылка на функцию в случае библиотеки

Файл: rnG.H

#pragma once 

#ifdef RNG_EXPORTS 
#define RNG_API __declspec(dllexport) 
#else 
#define RNG_API __declspec(dllimport) 
#endif 

RNG_API unsigned long GetRandom(unsigned long range); 

Файл: Rng.cpp

#include "Rng.h" 
#include "RngKiss.h" 

static TRngFile     gRngFile; 

unsigned long GetRandom(unsigned long range) 
{ 
    gRngFile.generate_rnd(); //Linker Error : Undefined Reference to function. 

    .... 
} 

Файл: RngKiss.h

#ifndef __RNGKISS_H__ 
#define __RNGKISS_H__ 

#ifndef ULONG 
typedef unsigned long ULONG; 
#endif //ULONG 


typedef struct 
{ 
    ULONG w, x, y, z; 
} TRngRecord; 


typedef struct 
{ 
    TRngRecord current, seed; 
    ULONG generate_rnd(void); 
} TRngFile; 

#endif 

Файл: RngKiss.cpp

#include "RngKiss.h" 


ULONG TRngFile::generate_rnd(void) 
{ 
    ULONG d; 
    return d; 
} 

Это мой выход.

g++.exe -L..\..\..\mingw64\lib\boost -o bin\Debug\TestCodeBlocks.exe obj\Debug\main.o obj\Debug\Rng.o obj\Debug\RngKiss.o 
obj\Debug\Rng.o: In function `GetRandom(unsigned long)': 
C:/Users/admin/TestCodeBlocks/Rng.cpp:8: undefined reference to `TRngFile::generate_rnd()' 
collect2.exe: error: ld returned 1 exit status 

Любые предложения по поводу того, почему я получаю эту ошибку компоновщика и как я могу ее решить?

ответ

3

Вы впали в немилость ошибки (или по крайней мере, эксцентриситет) в вашем mingw64, в довольно неясном вопросе компиляция неназванных структур. Я не знаю, какую версию вы имеете, но мой mingw32 4.8.1 имеет такое же поведение:

Эти typedef ей в rngKiss.h: -

typedef struct 
{ 
    ULONG w, x, y, z; 
} TRngRecord; 


typedef struct 
{ 
    TRngRecord current, seed; 
    ULONG generate_rnd(void); 
} TRngFile; 

Вы можете думать, что они соответственно определяют тип struct называемый TRngRecord, а другой - TRngFile, но строго они определяют TRngRecord и TRngFile как псевдонимы struct типов , которые сами являются неназванными.

Разница должна быть просто концептуальной. Так что это для компилятора Microsoft и для TDM GCC 4.9.2 для Windows, и поэтому он предназначен для GCC 4.9.2 и clang 3.5.1 для Linux.

Наши mingw компиляторы, однако, по-видимому, считают, что члены unamedstruct typedefed в TRngFile должен иметь статическую связь. Шахта генерирует:

Dump of file rngKiss.o 

File Type: COFF OBJECT 

COFF SYMBOL TABLE 
000 00000000 DEBUG notype  Filename  | .file 
    rngKiss.cpp 
002 00000000 SECT1 notype() Static  | __ZN8TRngFile12generate_rndEv 
... 

Следовательно, ошибка связи. В то время как TDM GCC 4.9.2 генерирует:

Dump of file rngKiss.o 

File Type: COFF OBJECT 

COFF SYMBOL TABLE 
000 00000000 DEBUG notype  Filename  | .file 
    rngKiss.cpp 
002 00000000 SECT1 notype() External  | _ZN8TRngFile12generate_rndEv 
... 

Есть 3 решения для этого:

Изменить ваш компилятор, сказать TDM НКУ.

Дайте имена своим typedefed struct с:

typedef struct TRngRecord 
{ 
    ULONG w, x, y, z; 
} TRngRecord; 


typedef struct TRngFile 
{ 
    TRngRecord current, seed; 
    ULONG generate_rnd(void); 
} TRngFile; 

и лучше всего:

Отбросьте typedef с, которые странным и ненужным способ именования классов в C++:

struct TRngRecord 
{ 
    ULONG w, x, y, z; 
}; 

struct TRngFile 
{ 
    TRngRecord current, seed; 
    ULONG generate_rnd(void); 
}; 

.... 

#include "rngKiss.h" 
... 
static TRngFile     gRngFile; 
+0

Спасибо, что освободили это. –

0
a few ideas come to mind. 

1) the '::' scope operator is most often used to access a method of a class. 
    (another common use is to reference a function in a namespace) 
    However, I do not see any class definition header file. 
    (normally, the class header file is the same name as the class) 

2) there has to be a prototype in a class header file 
    (usually this is part of the class declaration/interface) 
    for the generate_rnd() method. 

Итак, где же заголовок класса?

Итак, где прототип метода?

0

вопрос заключается в том, что функция находится в библиотеке.

это указывает на заявление линкер отсутствует либо «-Lpath к каталогу библиотеки» и/или «-ltruncated libary имя»

+0

Оба файла cpp и header находятся в одной и той же библиотеке –

Смежные вопросы