So I have 2 static libs defined like this:
StaticLib1
// StaticLib1.h
#pragma once
class StaticLib1
{
public:
void doSomething1();
};
cpp:
// StaticLib1.cpp
#include "pugixml.hpp"
#include "StaticLib1.h"
void StaticLib1::doSomething1()
{
pugi::xml_node node;
}
StaticLib2
// StaticLib2.h
#pragma once
class StaticLib2
{
public:
void doSomething2();
};
cpp:
// StaticLib1.cpp
#include "pugixml.hpp"
#include "StaticLib2.h"
void StaticLib2::doSomething2()
{
pugi::xml_node node;
}
Main
#include <iostream>
#include "StaticLib1.h"
#include "StaticLib2.h"
int main(int argv, char** argc)
{
StaticLib1 staticlib1;
StaticLib2 staticlib2;
staticlib1.doSemething1();
staticlib2.doSemething2();
getchar();
return 0;
}
Now, if I build this. I get a lot of linking errors. Here are the first few linking errors:
3>StaticLib2.lib(StaticLib2.obj) : error LNK2005: "public: __thiscall pugi::xml_attribute::xml_attribute(struct pugi::xml_attribute_struct *)" (??0xml_attribute#pugi##QAE#PAUxml_attribute_struct#1##Z) already defined in StaticLib1.lib(StaticLib1.obj)
3>StaticLib2.lib(StaticLib2.obj) : error LNK2005: "public: __thiscall pugi::xml_attribute::xml_attribute(void)" (??0xml_attribute#pugi##QAE#XZ) already defined in StaticLib1.lib(StaticLib1.obj)
3>StaticLib2.lib(StaticLib2.obj) : error LNK2005: "private: __thiscall pugi::xml_attribute_iterator::xml_attribute_iterator(struct pugi::xml_attribute_struct *,struct pugi::xml_node_struct *)" (??0xml_attribute_iterator#pugi##AAE#PAUxml_attribute_struct#1#PAUxml_node_struct#1##Z) already defined in StaticLib1.lib(StaticLib1.obj)
...
...
Now, I understand that this linking error is because there is a pugixml.obj inside StaticLib1.lib, and there is pugixml.obj inside StaticLib2.lib. But I don't understand why this would cause linking error with pugixml signatures. Why would they be defined twice? If I call staticlib1.doSomething1() shouldn't main not care if there are multiple definitions of pugi? Shouldn't staticlib1.doSomething1() handle all of that?
on the pugiconfig.hpp I have these specific settings:
#ifndef HEADER_PUGICONFIG_HPP
#define HEADER_PUGICONFIG_HPP
#define PUGIXML_WCHAR_MODE
#define PUGIXML_HEAD_ONLY
#include "pugixml.cpp"
#endif
So yes, from user0042advice, I realize it is better to compile a pugixml.lib on your own rather than having #include "pugixml.cpp" on the config. I'm working with legacy code so these surprises are there. Now, I've fixed my issue and made my company code slightly cleaner.
I try to build a DLL to allow my MT4 ( a well-known FX e-trading platform ) to also communicate with my server via Sockets ( see the code below, it works in the console program ) using Visual Studio 2017 and have encountered LNK2019 error.
From what I understand from various online blog/forum posts, this is owing to dependencies / exporting a dynamic library from a static library etc., but have no idea how to fix it.
MT4.h
#pragma once
#ifdef MT4_EXPORTS
#define MT4_API __declspec(dllexport)
#else
#define MT4_API __declspec(dllimport)
#endif
namespace MT4
{
class Functions
{
public:
static MT4_API void main();
};
}
MT4.cpp
#pragma comment(lib, "Ws2_32.lib")
#include "stdafx.h"
#include <WinSock2.h>
#include <WS2tcpip.h>
#include "MT4.h"
namespace MT4
{
void Functions::main()
{
char ipstr[] = "192.168.1.160";
int r;
WSAData wsaData;
WORD DLLVersion;
DLLVersion = MAKEWORD(2, 1);
r = WSAStartup(DLLVersion, &wsaData);
SOCKADDR_IN addr;
int addlen = sizeof(addr);
SOCKET sConnect;
sConnect = socket(AF_INET, SOCK_STREAM, NULL);
in_addr tmp = { 0 };
InetPtonA(AF_INET, ipstr, &tmp);
addr.sin_addr = tmp;
addr.sin_family = AF_INET;
addr.sin_port = htons(9898);
connect(sConnect, (SOCKADDR*)&addr, sizeof(addr));
closesocket(sConnect);
}
}
Error Messages:
Severity Code Description Project File Line Suppression State
Error LNK1120 6 unresolved externals MT4 C:\Users\FutureC\source\repos\MT4\Debug\MT4.dll 1
Error LNK2019 unresolved external symbol __imp__closesocket#4 referenced in function "public: static void __cdecl MT4::Functions::main(void)" (?main#Functions#MT4##SAXXZ) MT4 C:\Users\FutureC\source\repos\MT4\MT4\MT4.obj 1
Error LNK2019 unresolved external symbol __imp__connect#12 referenced in function "public: static void __cdecl MT4::Functions::main(void)" (?main#Functions#MT4##SAXXZ) MT4 C:\Users\FutureC\source\repos\MT4\MT4\MT4.obj 1
Error LNK2019 unresolved external symbol __imp__htons#4 referenced in function "public: static void __cdecl MT4::Functions::main(void)" (?main#Functions#MT4##SAXXZ) MT4 C:\Users\FutureC\source\repos\MT4\MT4\MT4.obj 1
Error LNK2019 unresolved external symbol __imp__socket#12 referenced in function "public: static void __cdecl MT4::Functions::main(void)" (?main#Functions#MT4##SAXXZ) MT4 C:\Users\FutureC\source\repos\MT4\MT4\MT4.obj 1
Error LNK2019 unresolved external symbol __imp__WSAStartup#8 referenced in function "public: static void __cdecl MT4::Functions::main(void)" (?main#Functions#MT4##SAXXZ) MT4 C:\Users\FutureC\source\repos\MT4\MT4\MT4.obj 1
Error LNK2019 unresolved external symbol __imp__inet_pton#12 referenced in function "public: static void __cdecl MT4::Functions::main(void)" (?main#Functions#MT4##SAXXZ) MT4 C:\Users\FutureC\source\repos\MT4\MT4\MT4.obj 1
This question already has answers here:
What is an undefined reference/unresolved external symbol error and how do I fix it?
(39 answers)
Closed 6 years ago.
I get this error, but I don't know how to fix it.
I'm using Visual Studio 2013.
code
-----DateUtils.h
#pragma once
#include <string>
class DateUtils
{
public:
DateUtils();
~DateUtils();
static time_t str2time_t(const std::string&, const std::string&);
};
-----ForexUtils32.h
#include <string>
// The following ifdef block is the standard way of creating macros which make exporting
// from a DLL simpler. All files within this DLL are compiled with the FOREXUTILS32_EXPORTS
// symbol defined on the command line. This symbol should not be defined on any project
// that uses this DLL. This way any other project whose source files include this file see
// FOREXUTILS32_API functions as being imported from a DLL, whereas this DLL sees symbols
// defined with this macro as being exported.
#ifdef FOREXUTILS32_EXPORTS
#define FOREXUTILS32_API __declspec(dllexport)
#else
#define FOREXUTILS32_API __declspec(dllimport)
#endif
// This class is exported from the ForexUtils32.dll
class FOREXUTILS32_API CForexUtils32 {
public:
CForexUtils32(void);
// TODO: add your methods here.
};
extern FOREXUTILS32_API int nForexUtils32;
FOREXUTILS32_API int fnForexUtils32(void);
/******************** Add Begin *************************/
FOREXUTILS32_API time_t str2time(const std::string&, const std::string&);
/******************** Add End *************************/
-------DateUtils.cpp
#include "stdafx.h"
#include "DateUtils.h"
#include <sstream>
#include <iomanip>
using namespace std;
DateUtils::DateUtils()
{
}
DateUtils::~DateUtils()
{
}
time_t str2time_t(const string& datetimeIn, const string& formatIn) {
struct tm tm_time;
// For C++11
istringstream iss(datetimeIn);
iss >> get_time(&tm_time, formatIn.c_str());
time_t time = mktime(&tm_time);
return time;
}
------ForexUtils32.cpp
// ForexUtils32.cpp : Defines the exported functions for the DLL application.
//
#include "stdafx.h"
#include "ForexUtils32.h"
#include "DateUtils.h"
// This is an example of an exported variable
FOREXUTILS32_API int nForexUtils32=0;
// This is an example of an exported function.
FOREXUTILS32_API int fnForexUtils32(void)
{
return 42;
}
// This is the constructor of a class that has been exported.
// see ForexUtils32.h for the class definition
CForexUtils32::CForexUtils32()
{
return;
}
/******************** Add Begin *************************/
FOREXUTILS32_API time_t str2time(const std::string& datetime, const std::string& format)
{
time_t t = DateUtils::str2time_t(datetime, format);
return t;
}
/******************** Add End *************************/
Error message:
Error 1 error LNK2019: unresolved external symbol "public: static
__int64 __cdecl DateUtils::str2time_t(class std::basic_string,class
std::allocator > const &,class std::basic_string,class std::allocator > const &)"
(?str2time_t#DateUtils##SA_JABV?$basic_string#DU?$char_traits#D#std##V?$allocator#D#2##std##0#Z) referenced in function "__int64 __cdecl str2time(class
std::basic_string,class
std::allocator > const &,class std::basic_string,class std::allocator > const &)"
(?str2time##YA_JABV?$basic_string#DU?$char_traits#D#std##V?$allocator#D#2##std##0#Z) D:\visual
studio
2013\Projects\32bit\ForexUtils32\ForexUtils32\ForexUtils32.obj ForexUtils32
How can i fix this error ?Help me Please(I'm not good at english very much. Thanks)
The first line of the function definition
time_t str2time_t(const string& datetimeIn, const string& formatIn) {
have to be
time_t DateUtils::str2time_t(const string& datetimeIn, const string& formatIn) {
(Add the class name to which the member function belongs)
Every answer (from what I've seen, which is a lot) to this question on this site has been addressed in my case, and I'm still at an impasse. I'm working with legacy code, having to hack my way through setting up a properly connected development environment. Using VS 2012, I have a solution with 22 projects in it with a spiderweb of dependencies between them. 1 project, phtranscript, depends on code from another project hunspell, and phtranscript's code is in turn needed by a 3rd project speechRecognizer. Here are the associated files and the compiler/linker output:
In project phtranscript:
phTranscript.h:
#ifndef _phTranscript_h__
#define _phTranscript_h__
#include <vector>
#include <string>
#include <map>
#include "config.h"
#include "character.h"
...
class hunspellMorph{
public:
static hunspellMorph *instance();
protected:
hunspellMorph();
private:
hunspellMorph(const hunspellMorph &);
hunspellMorph& operator=(const hunspellMorph &);
public:
~hunspellMorph();
void Morph(const std::string &in,std::vector<std::string> &out);
private:
class impl;
impl *pImpl_;
};
#endif
hunspellMorph.cpp:
#include "phTranscript.h"
#include "hunspell.hxx"
#include <treeNode.h>
#include <string.h>
class hunspellMorph::impl{
private:
Hunspell hs;
public:
impl();
void Morph(const std::string &in,std::vector<std::string> &out);
};
void hunspellMorph::impl::Morph(const std::string &in,std::vector<std::string> &out){
char **slst;
int re = hs.analyze(&slst,in.c_str());
...
freelist(&slst,re);
}
hunspellMorph::hunspellMorph(){
pImpl_ = new impl();
}
hunspellMorph::~hunspellMorph(){
delete pImpl_;
}
....
In project hunspell:
hunspell.hxx:
#include "affixmgr.hxx"
#include "suggestmgr.hxx"
#include "csutil.hxx"
#include "langnum.hxx"
#define SPELL_COMPOUND (1 << 0)
#define SPELL_FORBIDDEN (1 << 1)
#define SPELL_ALLCAP (1 << 2)
#define SPELL_NOCAP (1 << 3)
#define SPELL_INITCAP (1 << 4)
#define MAXDIC 20
#define MAXSUGGESTION 15
#define MAXSHARPS 5
#ifndef _HUNSPELL_HXX_
#define _HUNSPELL_HXX_
class Hunspell
{
...
public:
Hunspell(const char * affpath, const char * dpath, const char * key = NULL);
~Hunspell();
int analyze(char ***slst,const char *word,int d=0);
...
};
#endif
csutil.hxx:
#ifndef __CSUTILHXX__
#define __CSUTILHXX__
// First some base level utility routines
#define NOCAP 0
#define INITCAP 1
#define ALLCAP 2
#define HUHCAP 3
#define HUHINITCAP 4
#define MORPH_STEM "st:"
#define MORPH_ALLOMORPH "al:"
#define MORPH_POS "po:"
#define MORPH_DERI_PFX "dp:"
#define MORPH_INFL_PFX "ip:"
#define MORPH_TERM_PFX "tp:"
#define MORPH_DERI_SFX "ds:"
#define MORPH_INFL_SFX "is:"
#define MORPH_TERM_SFX "ts:"
#define MORPH_SURF_PFX "sp:"
#define MORPH_FREQ "fr:"
#define MORPH_PHON "ph:"
#define MORPH_HYPH "hy:"
#define MORPH_PART "pa:"
#define MORPH_HENTRY "_H:"
#define MORPH_TAG_LEN strlen(MORPH_STEM)
#define MSEP_FLD ' '
#define MSEP_REC '\n'
#define MSEP_ALT '\v'
// default flags
#define DEFAULTFLAGS 65510
#define FORBIDDENWORD 65510
#define ONLYUPCASEFLAG 65511
typedef struct {
unsigned char l;
unsigned char h;
} w_char;
#define w_char_eq(a,b) (((a).l == (b).l) && ((a).h == (b).h))
...
// free character array list
void freelist(char *** list, int n);
#endif
hunspell.cxx:
#include "license.hunspell"
#include "license.myspell"
#ifndef MOZILLA_CLIENT
#include <cstdlib>
#include <cstring>
#include <cstdio>
#else
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#endif
#include "hunspell.hxx"
#include "./config.h"
#include "./treeNode.h"
#include "cache.h"
#include <string>
#include <vector>
#ifndef MOZILLA_CLIENT
#ifndef W32
using namespace std;
#endif
#endif
Hunspell::Hunspell(const char * affpath, const char * dpath, const char * key)
{
...
}
Hunspell::~Hunspell()
{
...
}
int Hunspell::analyze(char ***slst,const char *word,int d){
...
}
csutil.cxx:
#include "license.hunspell"
#include "license.myspell"
#ifndef MOZILLA_CLIENT
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cctype>
#else
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <ctype.h>
#endif
#include "csutil.hxx"
#include "atypes.hxx"
#include "langnum.hxx"
#ifdef OPENOFFICEORG
# include <unicode/uchar.h>
#else
# ifndef MOZILLA_CLIENT
# include "utf_info.cxx"
# define UTF_LST_LEN (sizeof(utf_lst) / (sizeof(unicode_info)))
# endif
#endif
#ifdef MOZILLA_CLIENT
#include "nsCOMPtr.h"
#include "nsServiceManagerUtils.h"
#include "nsIUnicodeEncoder.h"
#include "nsIUnicodeDecoder.h"
#include "nsICaseConversion.h"
#include "nsICharsetConverterManager.h"
#include "nsUnicharUtilCIID.h"
#include "nsUnicharUtils.h"
static NS_DEFINE_CID(kCharsetConverterManagerCID, NS_ICHARSETCONVERTERMANAGER_CID);
static NS_DEFINE_CID(kUnicharUtilCID, NS_UNICHARUTIL_CID);
#endif
#ifdef MOZILLA_CLIENT
#ifdef __SUNPRO_CC // for SunONE Studio compiler
using namespace std;
#endif
#else
#ifndef W32
using namespace std;
#endif
#endif
...
void freelist(char *** list, int n) {
if (list && (n > 0)) {
for (int i = 0; i < n; i++) if ((*list)[i]) free((*list)[i]);
free(*list);
*list = NULL;
}
}
And here's the output on a clean build between the different projects:
6>------ Build started: Project: hunspell, Configuration: Debug Win32 ------
...
6> hunspell.vcxproj -> C:\temp\speech\divided_rm_speech_proj\Debug\hunspell.exe
...
10>------ Build started: Project: phtranscript, Configuration: Debug Win32 ------
...
10> phtranscript.vcxproj -> C:\temp\speech\divided_rm_speech_proj\Debug\phtranscript.exe
...
19>------ Build started: Project: speechRecognizer, Configuration: Debug Win32 ------
...
19> Generating Code...
19>hunspellMorph.obj : error LNK2019: unresolved external symbol "void __cdecl freelist(char * * *,int)" (?freelist##YAXPAPAPADH#Z) referenced in function "public: void __thiscall hunspellMorph::impl::Morph(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class std::vector<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::allocator<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > &)" (?Morph#impl#hunspellMorph##QAEXABV?$basic_string#DU?$char_traits#D#std##V?$allocator#D#2##std##AAV?$vector#V?$basic_string#DU?$char_traits#D#std##V?$allocator#D#2##std##V?$allocator#V?$basic_string#DU?$char_traits#D#std##V?$allocator#D#2##std###2##4##Z)
19>hunspellMorph.obj : error LNK2019: unresolved external symbol "public: __thiscall Hunspell::Hunspell(char const *,char const *,char const *)" (??0Hunspell##QAE#PBD00#Z) referenced in function "public: __thiscall hunspellMorph::impl::impl(void)" (??0impl#hunspellMorph##QAE#XZ)
19>hunspellMorph.obj : error LNK2019: unresolved external symbol "public: __thiscall Hunspell::~Hunspell(void)" (??1Hunspell##QAE#XZ) referenced in function "public: __thiscall hunspellMorph::impl::~impl(void)" (??1impl#hunspellMorph##QAE#XZ)
19>hunspellMorph.obj : error LNK2019: unresolved external symbol "public: int __thiscall Hunspell::analyze(char * * *,char const *,int)" (?analyze#Hunspell##QAEHPAPAPADPBDH#Z) referenced in function "public: void __thiscall hunspellMorph::impl::Morph(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class std::vector<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::allocator<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > &)" (?Morph#impl#hunspellMorph##QAEXABV?$basic_string#DU?$char_traits#D#std##V?$allocator#D#2##std##AAV?$vector#V?$basic_string#DU?$char_traits#D#std##V?$allocator#D#2##std##V?$allocator#V?$basic_string#DU?$char_traits#D#std##V?$allocator#D#2##std###2##4##Z)
19>C:\temp\speech\divided_rm_speech_proj\Debug\speechRecognizer.exe : fatal error LNK1120: 4 unresolved externals
Keep in mind there is a lot of code taken out, so if something's missing that's important let me know and I'll update this description.
In Visual Studio 2012's environment setup, phtranscript's project properties have a hunspell reference established under common properties, the include directories field includes the hunspell include directory, and the library directories field includes the hunspell library output folder (this is all under VC++ Directories), the C/C++ additional include directories also lists the hunspell include directory. I left the Linker->Input additional libraries field alone since I get "already declared symbol" linker errors when I have both it and the VC++ directory specified. Under Project Dependencies I check hunspell and ensure it precedes phtranscript in the build order. Lastly, I have manually added the existing hunspell libraries (after they've been compiled) to the phtranscript project. In the speechrecognizer project, I've taken identical steps as they correspond to the phtranscript project dependencies.
The code is pretty much a nightmare imo. What're the minimal amount of changes needed to fix this? Preferably just by changing/adding something on the IDE side instead of code changes (although those are inevitable).
UPDATE:
All the projects were designated as applications under project properties. After changing them to static libraries (all but the 1 project meant to execute), the link errors became this:
21>speechRecognizer.lib(hunspellMorph.obj) : error LNK2019: unresolved external symbol "void __cdecl freelist(char * * *,int)" (?freelist##YAXPAPAPADH#Z) referenced in function "public: void __thiscall hunspellMorph::impl::Morph(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class std::vector<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::allocator<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > &)" (?Morph#impl#hunspellMorph##QAEXABV?$basic_string#DU?$char_traits#D#std##V?$allocator#D#2##std##AAV?$vector#V?$basic_string#DU?$char_traits#D#std##V?$allocator#D#2##std##V?$allocator#V?$basic_string#DU?$char_traits#D#std##V?$allocator#D#2##std###2##4##Z)
21>speechRecognizer.lib(hunspellMorph.obj) : error LNK2019: unresolved external symbol "public: __thiscall Hunspell::Hunspell(char const *,char const *,char const *)" (??0Hunspell##QAE#PBD00#Z) referenced in function "public: __thiscall hunspellMorph::impl::impl(void)" (??0impl#hunspellMorph##QAE#XZ)
21>speechRecognizer.lib(hunspellMorph.obj) : error LNK2019: unresolved external symbol "public: __thiscall Hunspell::~Hunspell(void)" (??1Hunspell##QAE#XZ) referenced in function "public: __thiscall hunspellMorph::impl::~impl(void)" (??1impl#hunspellMorph##QAE#XZ)
21>speechRecognizer.lib(hunspellMorph.obj) : error LNK2019: unresolved external symbol "public: int __thiscall Hunspell::analyze(char * * *,char const *,int)" (?analyze#Hunspell##QAEHPAPAPADPBDH#Z) referenced in function "public: void __thiscall hunspellMorph::impl::Morph(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class std::vector<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::allocator<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > &)" (?Morph#impl#hunspellMorph##QAEXABV?$basic_string#DU?$char_traits#D#std##V?$allocator#D#2##std##AAV?$vector#V?$basic_string#DU?$char_traits#D#std##V?$allocator#D#2##std##V?$allocator#V?$basic_string#DU?$char_traits#D#std##V?$allocator#D#2##std###2##4##Z)
21>C:\temp\speech\divided_rm_speech_proj\Debug\interface11.exe : fatal error LNK1120: 8 unresolved externals
These link errors wait until compiling the application at the very end to spring up, rather than when compiling speechrecognizer as an application. There are other unresolved linkages, but they seem independent (albeit related) to this problem.
Your output tells me, that both projects are compiled to *.exe files. I do not know how do you expect 'phtranscript' to use modules, that are part of 'hunspell', in this case.
If you create such dependencies, hunspell should be static (or dynamic) library, which phtranscript links to. I believe you DO set all dependencies correctly, but VS does not have anything to link together and that's why linker is so angry at you - it can not use *.exe as a dependency.
Simple solution: change 'hunspell' type to 'static library (.lib)' or 'dynamic library (.dll)' and setup 'phtranscript' to use it as an input library.
I have the following .h and .cpp files
If i have to I will include the full codes of the function definitions
When i compile my program i get the errors shown at the end
hash.h
#define BUCKETS 64
#define B_ENTRIES 50000
int curr_tanker;
typedef unsigned long int ulong;
typedef struct bucket
{
int bucket_id;
ulong bucket_entries;
}bucket;
typedef struct tanker_record
{
ulong tanker_id;
ulong tanker_size;
ulong num_of_entries;
ulong bucket_entry_count;
}tanker_record;
typedef struct fpinfo
{
unsigned long chunk_offset;
unsigned long chunk_length;
unsigned char fing_print[33];
}fpinfo;
struct fpinfo* InitHTable(fpinfo *);
int CreateTanker(tanker_record tr[]);
int Hash_CreateEntry(struct fpinfo *,struct fpinfo he,tanker_record tr);
ht.cpp
#include <stdlib.h>
#include <string.h>
#include<stdio.h>
#include <iostream>
#include "ht.h"
struct fpinfo* InitHTable(struct fpinfo ht[][B_ENTRIES])
{
}
int CreateTanker(tanker_record tr[])
{
}
int
Hash_CreateEntry(struct fpinfo *t[][B_ENTRIES],struct fpinfo he,tanker_record tr[])
{
}
static void
WriteHTtoFile(struct fpinfo *t[][B_ENTRIES],int this_tanker)
{
}
main.cpp
#include<iostream>
#include"ht.cpp"
#include<conio.h>
#include<stdlib.h>
void main(int argc, char **argv)
{
static fpinfo hash_table[BUCKETS][B_ENTRIES];
static tanker_record tr[100];
InitHTable(&hash_table[0][0]);
CreateTanker(tr);
struct fpinfo fp;
...
ar = Hash_CreateEntry(&hash_table[0][0], fp,tr[0]);
i get the following errors when i try to compile it using vc2010
1>main.obj : error LNK2005: "struct fpinfo * __cdecl InitHTable(struct fpinfo (* const)[50000])" (?InitHTable##YAPAUfpinfo##QAY0MDFA#U1##Z) already defined in ht.obj
1>main.obj : error LNK2005: "int __cdecl CreateTanker(struct tanker_record * const)"
(?CreateTanker##YAHQAUtanker_record###Z) already defined in ht.obj
1>main.obj : error LNK2005: "int __cdecl Hash_CreateEntry(struct fpinfo * (* const)[50000],struct fpinfo,struct tanker_record * const)" (?Hash_CreateEntry##YAHQAY0MDFA#PAUfpinfo##U1#QAUtanker_record###Z) already defined in ht.obj
1>main.obj : error LNK2005: "int curr_tanker" (?curr_tanker##3HA) already defined in ht.obj
1>main.obj : error LNK2019: unresolved external symbol "int __cdecl Hash_CreateEntry(struct fpinfo *,struct fpinfo,struct tanker_record)"
(?Hash_CreateEntry##YAHPAUfpinfo##U1#Utanker_record###Z) referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol "struct fpinfo * __cdecl InitHTable(struct fpinfo *)" (?InitHTable##YAPAUfpinfo##PAU1##Z) referenced in function _main
THANKS FOR YOUR HELP!!
You're including ht.cpp from main.cpp, which will include all the definitions of functions already defined in ht.cpp itself.
You want to include ht.h instead.
It won't help in this situation, but you should also protect the header file with include guards:
#ifndef HT_H
#define HT_H
// contents of ht.h
#endif
You also need the arguments of the function declarations to match those of the definitions:
struct fpinfo* InitHTable(struct fpinfo[][B_ENTRIES]);
// Missing: ^^^^^^^^^^^
int CreateTanker(tanker_record tr[]); // OK
int Hash_CreateEntry(struct fpinfo*[][B_ENTRIES],struct fpinfo,tanker_record[]);
// Missing ^^^^^^^^^^^^^ ^^
Add an "include guard" in your header, so that it its contents aren't "seen" twice after preprocessing. For Microsoft, #pragma once at the beginning of the .h file. In general, add:
#ifndef __YOUR_HEADER_H
#define __YOUR_HEADER_H
// all the stuff from the header here
#endif
Make sure to adopt a consistent "unique" naming scheme for each of your headers. __YOUR_HEADER_H would do, for example customio.h into __CUSTOM_IO_H.