リンクしているはずなのにLNK2019とfatal error 1120が出る

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
結城
記事: 52
登録日時: 10年前
連絡を取る:

リンクしているはずなのにLNK2019とfatal error 1120が出る

#1

投稿記事 by 結城 » 10年前

つまらない質問ですいませんorz
今回、ヘッダファイルで関数をリンクしているはずなのにコンパイル時にリンクエラーが出るのです

ファイルの構造は
function.hにて
GLOBAL int run(int *size,xml_struct_t dest,const _variant_t XML_SRC);
を定義

xml.cppで

コード:

#include "GV.h"

#undef max

void WriteString (const wchar_t * format, ...)
{
    std::vector<wchar_t> buffer;
    for (std::size_t max_count = 256; max_count < std::numeric_limits<std::size_t>::max() - 256; max_count += 256)
    {
        buffer.resize(max_count);
        va_list vl;
        va_start(vl, format);
        std::size_t written = std::vswprintf(&buffer[0], max_count - 1, format, vl);
        va_end(vl);
 
        if (written >= max_count - 1)
        {
            continue;
        }
        break;
    }
 
    std::wstring stringToWrite(&buffer[0]);
    DWORD written;
 
    ::WriteConsoleW(::GetStdHandle(STD_OUTPUT_HANDLE), stringToWrite.c_str(), stringToWrite.size(), &written, 0);
    ::OutputDebugStringW(stringToWrite.c_str());
}


int run(int *size,xml_struct_t *dest,const _variant_t XML_SRC)
{
    // COMの初期化と後片付け
    struct ComInitializer {
        ComInitializer()
        {
            ::CoInitialize(NULL);
        }
        ~ComInitializer()
        {
            ::CoUninitialize();
        }
    } COM_INITIALIZER;
 
    // DOMの作成
    MSXML2::IXMLDOMDocument2Ptr xmlDom;
    HRESULT hr;
    if (FAILED(hr = xmlDom.CreateInstance(__uuidof(MSXML2::DOMDocument60), NULL, CLSCTX_INPROC_SERVER)))
    {
        WriteString(L"DOM Create Error (%08X)\n", hr);
        return 1;
    }
 
    try
    {
        // APIの読み込み
        xmlDom->async = VARIANT_FALSE;
        xmlDom->validateOnParse = VARIANT_FALSE;
        xmlDom->resolveExternals = VARIANT_FALSE;
 
        if (xmlDom->load(XML_SRC) != VARIANT_TRUE)
        {
            WriteString(L"Load Error : %s\n", (LPCWSTR)xmlDom->parseError->Getreason());
            return 2;
        }
 
        // APIの名前空間設定
        xmlDom->setProperty(L"SelectionNamespaces", L"xmlns:A='urn:yahoo:jp:jlp'");
        xmlDom->setProperty(L"SelectionLanguage", L"XPath");

		std::wstring uri =xmlDom->GetnamespaceURI();
        // 結果の表示
		MSXML2::IXMLDOMNodeListPtr words = xmlDom->documentElement->selectNodes(L"A:ma_result//A:word[A:surface/text()][A:reading/text()][A:pos/text()]");
		if(dest==NULL)
		{
			return *size=words->length;
		}else{
			for (int i = 0; i < words->length; ++i)
			{
			    MSXML2::IXMLDOMNodePtr wordElement = words->item[i];
			    MSXML2::IXMLDOMTextPtr surfaceText = wordElement->selectSingleNode(L"A:surface/text()");
			    MSXML2::IXMLDOMTextPtr readingText = wordElement->selectSingleNode(L"A:reading/text()");
			    MSXML2::IXMLDOMTextPtr posText = wordElement->selectSingleNode(L"A:pos/text()");
			
			    std::wstring surface = surfaceText->text;
			    std::wstring reading = readingText->text;
			    std::wstring pos = posText->text;
				char * surface_c = new char[wstr_sizeget(surface)];
				cnarrow(surface,surface_c);
				char * reading_c = new char[wstr_sizeget(reading)];
				cnarrow(reading,reading_c);
				char * pos_c = new char[wstr_sizeget(pos)];
				cnarrow(pos,pos_c);
				//DrawFormatStringEx(x,y,GetColor(255,255,255),"@%i : %s (%s) = %s\n", i, surface_c, reading_c, pos_c);
				//y+=GetFontSize();
				
				delete [] surface_c;
				delete [] reading_c;
				delete [] pos_c;
			}
		}
    }
    catch (const _com_error & e)
    {
        DrawFormatString(0,0,GetColor(255,255,255),"Com Exception (%08X)\n", e.Error());
        DrawFormatStringEx(0,0,GetColor(255,255,255),(char*)e.ErrorMessage());
 
        return 3;
    }
    return 0;
}
ちなみにコードは未完成です

そしてinterface.cppで
run(NULL,xml_c[8],Request->ResponseStream);
と呼んでいるのですが
エラー 123 error LNK2019: 未解決の外部シンボル "int __cdecl run(int *,struct xml_struct_t,class _variant_t)" (?run@@YAHPAHUxml_struct_t@@V_variant_t@@@Z) が関数 "void __cdecl grammar_understander(char *)" (?grammar_understander@@YAXPAD@Z) で参照されました。
エラー 124 fatal error LNK1120: 外部参照 1 が未解決です。
となります……

謎です

いくらかいじくったのですが実体はあるし、定義はしてるし
よくわからんです

誰か助けてください・・・・
ANGE;ART

box
記事: 1760
登録日時: 10年前

Re: リンクしているはずなのにLNK2019とfatal error 1120が出る

#2

投稿記事 by box » 10年前

>function.h

全体を見せてください。

>GLOBAL int run(int *size,xml_struct_t dest,const _variant_t XML_SRC);

GLOBALを、どこでどういう風に定義していますか?

#ifdef なんとか
#define GLOBAL extern
#endif

とか、ですか?

>interface.cpp

ヘッダーファイルをインクルードしている箇所を見せてください。

こんな回答をしなくてすむように、最初っから全部さらけ出してくださると助かるんですけどね。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
結城
記事: 52
登録日時: 10年前
連絡を取る:

Re: リンクしているはずなのにLNK2019とfatal error 1120が出る

#3

投稿記事 by 結城 » 10年前

すいません、全部はると長文になるので避けたかったのですが貼ります

GLOBALの定義位置はGV.hのfunction.hを呼び出す前で
#ifdef GLOBAL_INSTANCE
#define GLOBAL
#else
#define GLOBAL extern
#endif
となっています

以下は該当位置前後のコードです

function.h

コード:

	GLOBAL int ProcessLoop();

	GLOBAL void music_ini();
	GLOBAL void music_play();

	/*AddFunction*/
	GLOBAL int GetWindowHeight();
	GLOBAL int GetWindowWidth();
	GLOBAL int GetMousePointX();
	GLOBAL int GetMousePointY();
	GLOBAL int sys_info_DxL();
	GLOBAL int sys_info_DX();
	GLOBAL int sys_info_win();
	GLOBAL DWORD sys_color_r();
	GLOBAL DWORD sys_color_r_w();
	GLOBAL void _mbsini(char * src);
	GLOBAL void TscDrawFormatStringToHandleWithWidthPlusWait(int x,int y,int y_offset,int color,int font_handle,char *src,int a,int n,bool wait = TRUE);
	GLOBAL void DrawFormatStringToHandleWithWidthPlusWait(int x,int y,int y_offset,int color,int font_handle,char *src,int n,bool wait = TRUE);
	GLOBAL int tp_clear01();
	GLOBAL int pc0_1(int a,int b);
	GLOBAL void DrawXmlStringEx(int x,int y,char* string,int color);
	GLOBAL void DrawStringEx(int x,int y,char* string,int color);
	GLOBAL void DrawFormatStringEx(int x,int y,int color,char* formatstring , ...);
	GLOBAL void DrawFormatStringToHandleEx(int x,int y,int color,int fonthandle,char* formatstring , ...);
	GLOBAL void narrow(const std::wstring &src, std::string &dest);
	GLOBAL void widen(const std::string &src, std::wstring &dest);
	GLOBAL void cnarrow(const std::wstring &src, char * &dest);
	GLOBAL int wstr_sizeget(const std::wstring &src);

	/*DrawProcesses*/
	GLOBAL void draw_of_main_sys_first();
	GLOBAL void draw_mouse_point();
	GLOBAL int winreg_search_emptyaddress(int alr = -1);
	GLOBAL int release_regedwin(int sys_hnd);
	GLOBAL int reg_window(int x,int y,int x1,int y1,int color,char caption[],int sys_hnd);
	GLOBAL int create_inputtextsection(int x,int y,int x1,int y1,int sys_hnd,int max,int cancelflag=FALSE,int SingleCharOnlyFlag=FALSE,int NumCharOnlyFlag=FALSE,char * text="");
	GLOBAL int SetActiveKeyInputFromSysHandle(int sys_hnd);
	GLOBAL int release_inputtext_sec(int sys_hnd);
	GLOBAL void DrawFormatStringToHandleEx(int x,int y,int color,int fonthandle,char* formatstring , ...);
	GLOBAL void win_draw_main();

	GLOBAL int InterFace_main();
	GLOBAL void ini();

	GLOBAL char * name_understander(char * src);
	GLOBAL void grammar_understander(char * src);
	GLOBAL void dictionary_loader(int file_index);
	GLOBAL void drawout_dictionary_contents(char * dst,int index,int n);

	GLOBAL int run(int *size,xml_struct_t dest,const _variant_t XML_SRC);//<-該当箇所
interface.cpp(該当箇所前後)

コード:

void grammar_understander(char *src)
{
	char *a;
	int i=0;
	for(a=src;*a;++a)
	{
		switch(*a)
		{
			case '$':
			{
				if(i == 0)
				{
					command_understander(src);
				}else{
					MessageBox(GetMainWindowHandle(),TEXT("Format Error\nProcess:AISU_GRU_CMDCK\nEC:C060"),TEXT("Slight Error -by ALT AIS API-"),MB_SYSTEMMODAL);
					AppLogAdd("Format Error -> Process:AISU_GRU_CMDCK ErrorCode:%X ErrorLevel:Slight\nProbably cause is position of command control character...");
				}
			}
			break;
			default:
				break;
		}
	}
	::CoInitialize(NULL);
	WinHttp::IWinHttpRequestPtr Request;
	Request.CreateInstance(WinHttp::CLSID_WinHttpRequest);
	wchar_t anlyse_src[512];
	wcscat_s(anlyse_src,wcslen(anlyse_src),YAHOOAPI_JPNANALYSIS_URL_W);
	wchar_t *_wsrc = new wchar_t[_mbslen(UCC(src)) + 1];
	mbstowcs(_wsrc, src, _mbslen(UCC(src)) + 1);
	wcscat_s(anlyse_src,wcslen(anlyse_src),_wsrc);
	delete []_wsrc;
	Request->Open(L"GET", anlyse_src);
	Request->Send();
	::CoUninitialize();
	xml_struct_t xml_c[8];
	run(NULL,xml_c[8],Request->ResponseStream);

}
xml.cpp(実体部)

コード:

#include "GV.h"

#undef max

void WriteString (const wchar_t * format, ...)
{
    std::vector<wchar_t> buffer;
    for (std::size_t max_count = 256; max_count < std::numeric_limits<std::size_t>::max() - 256; max_count += 256)
    {
        buffer.resize(max_count);
        va_list vl;
        va_start(vl, format);
        std::size_t written = std::vswprintf(&buffer[0], max_count - 1, format, vl);
        va_end(vl);
 
        if (written >= max_count - 1)
        {
            continue;
        }
        break;
    }
 
    std::wstring stringToWrite(&buffer[0]);
    DWORD written;
 
    ::WriteConsoleW(::GetStdHandle(STD_OUTPUT_HANDLE), stringToWrite.c_str(), stringToWrite.size(), &written, 0);
    ::OutputDebugStringW(stringToWrite.c_str());
}


int run(int *size,xml_struct_t *dest,const _variant_t XML_SRC)
{
    // COMの初期化と後片付け
    struct ComInitializer {
        ComInitializer()
        {
            ::CoInitialize(NULL);
        }
        ~ComInitializer()
        {
            ::CoUninitialize();
        }
    } COM_INITIALIZER;
 
    // DOMの作成
    MSXML2::IXMLDOMDocument2Ptr xmlDom;
    HRESULT hr;
    if (FAILED(hr = xmlDom.CreateInstance(__uuidof(MSXML2::DOMDocument60), NULL, CLSCTX_INPROC_SERVER)))
    {
        WriteString(L"DOM Create Error (%08X)\n", hr);
        return 1;
    }
 
    try
    {
        // APIの読み込み
        xmlDom->async = VARIANT_FALSE;
        xmlDom->validateOnParse = VARIANT_FALSE;
        xmlDom->resolveExternals = VARIANT_FALSE;
 
        if (xmlDom->load(XML_SRC) != VARIANT_TRUE)
        {
            WriteString(L"Load Error : %s\n", (LPCWSTR)xmlDom->parseError->Getreason());
            return 2;
        }
 
        // APIの名前空間設定
        xmlDom->setProperty(L"SelectionNamespaces", L"xmlns:A='urn:yahoo:jp:jlp'");
        xmlDom->setProperty(L"SelectionLanguage", L"XPath");

		std::wstring uri =xmlDom->GetnamespaceURI();
        // 結果の表示
		MSXML2::IXMLDOMNodeListPtr words = xmlDom->documentElement->selectNodes(L"A:ma_result//A:word[A:surface/text()][A:reading/text()][A:pos/text()]");
		if(dest==NULL)
		{
			return *size=words->length;
		}else{
			for (int i = 0; i < words->length; ++i)
			{
			    MSXML2::IXMLDOMNodePtr wordElement = words->item[i];
			    MSXML2::IXMLDOMTextPtr surfaceText = wordElement->selectSingleNode(L"A:surface/text()");
			    MSXML2::IXMLDOMTextPtr readingText = wordElement->selectSingleNode(L"A:reading/text()");
			    MSXML2::IXMLDOMTextPtr posText = wordElement->selectSingleNode(L"A:pos/text()");
			
			    std::wstring surface = surfaceText->text;
			    std::wstring reading = readingText->text;
			    std::wstring pos = posText->text;
				char * surface_c = new char[wstr_sizeget(surface)];
				cnarrow(surface,surface_c);
				char * reading_c = new char[wstr_sizeget(reading)];
				cnarrow(reading,reading_c);
				char * pos_c = new char[wstr_sizeget(pos)];
				cnarrow(pos,pos_c);
				//DrawFormatStringEx(x,y,GetColor(255,255,255),"@%i : %s (%s) = %s\n", i, surface_c, reading_c, pos_c);
				//y+=GetFontSize();
				
				delete [] surface_c;
				delete [] reading_c;
				delete [] pos_c;
			}
		}
    }
    catch (const _com_error & e)
    {
        DrawFormatString(0,0,GetColor(255,255,255),"Com Exception (%08X)\n", e.Error());
        DrawFormatStringEx(0,0,GetColor(255,255,255),(char*)e.ErrorMessage());
 
        return 3;
    }
    return 0;
}
ファイルの並び順(あんま関係ないかもですが……)
interface.cpp
xml.cpp
function.h

[hr]
訂正#ifdef~#endifの構文がおかしくなっていたのを書きなおし
最後に編集したユーザー 結城 on 2010年12月12日(日) 23:01 [ 編集 1 回目 ]
ANGE;ART

アバター
Justy
副管理人
記事: 122
登録日時: 10年前
住所: 神奈川県

Re: リンクしているはずなのにLNK2019とfatal error 1120が出る

#4

投稿記事 by Justy » 10年前

Hinari さんが書きました: function.hにて
GLOBAL int run(int *size,xml_struct_t dest,const _variant_t XML_SRC);
を定義

xml.cppで

コード:


int run(int *size,xml_struct_t *dest,const _variant_t XML_SRC)
{
  hとcpp側で第二引数の型が一致していないですよ。

box
記事: 1760
登録日時: 10年前

Re: リンクしているはずなのにLNK2019とfatal error 1120が出る

#5

投稿記事 by box » 10年前

>#else GLOBAL extern

#else
#define GLOBAL extern
とか、ではなくって、本当にそうなってるんですか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
結城
記事: 52
登録日時: 10年前
連絡を取る:

Re: リンクしているはずなのにLNK2019とfatal error 1120が出る

#6

投稿記事 by 結城 » 10年前

あ、すみません
書き間違いです
ANGE;ART

アバター
結城
記事: 52
登録日時: 10年前
連絡を取る:

Re: リンクしているはずなのにLNK2019とfatal error 1120が出る

#7

投稿記事 by 結城 » 10年前

記入漏れ……orz
Justyさん指摘ありがとうございます
コンパイル通りました
ちょっと焦って前が見えなくなっていたみたいです・・・
ANGE;ART

閉鎖

“C言語何でも質問掲示板” へ戻る