방금 Microsoft Visual Studio 2010에 C++ 코드를 콘솔 프로그램으로 제공한다는 개념 증명을 완료했습니다.MSVS2010 MSVS2010에 포팅 된 C++ 콘솔 코드 C++ GUI가 실패합니다. 왜?
#include "stdafx.h"
#include <stdio.h>
#include <Windows.h>
#include <stdlib.h>
#include <sndfile.h>
//The following libraries are related to parsing the text files
#include <iostream> //Open the file
#include <fstream> //Reading to and from files
//The following libraries are for conducting the DTW analysis
#include "dtw.h"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
printf("This is a test\n");
//This will be the length of the buffer used to hold samples while the program processes them.
//A SNDFILE is like FILE in a standard C library. Consequently, the sf_open_read and sf_open_write functions will return an
//SNDFILE* pointer when they successfully open the specified file.
SNDFILE* sf = NULL;
/*SF_INFO will obtain information of the file we wish to load into our program. */
SF_INFO info;
/*The following is descriptive information to obtain from wave files. These are declarations*/
int num_channels;
double num, num_items;S
double *buf;
int f, sr, c;
int i,j;
FILE *out;
/*This is where the program will open the WAV file */
info.format = 0;
sf = sf_open("C:\\Users\\GeekyOmega\\Desktop\\gameon.wav", SFM_READ, &info);
if(sf == NULL)
{
printf("Failed to open the file.\n");
getchar();
exit(-1);
}
/*Print some file information */
f = info.frames;
sr = info.samplerate;
c = info.channels;
/*Print information related to file*/
printf("frames = %d\n",f);
printf("sample rate = %d\n",sr);
printf("channels = %d\n",c);
/*Calculate and print the number of items*/
num_items = f*c;
printf("Read %lf items\n", num_items);
/*Allocate space for the data to be read*/
buf = (double *) malloc(num_items*sizeof(double));
num = sf_read_double(sf,buf,num_items);
sf_close(sf);
/*print the information*/
printf("Read %lf items\n", num);
/*Write the data to the filedata.out*/
out = fopen("filedata.txt", "w");
for(i = 0; i < num; i+=c)
{
for(j = 0; j < c; ++j)
{
fprintf(out, "%lf ", buf[i +j]);
}
fprintf(out,"\n");
}
fclose(out);
}
그래서 다음에,이 내가이는 GUI 작업 할 중요하다 : 컴파일 된 C++ 코드는 아래와 같습니다. 즉, 원하는 파일을로드하고 해당 wav 파일을 텍스트로 변환합니다. 나는 아래 코드를 제공한다 :
#pragma once
//Libraries required for libsndfile
#include <sndfile.h>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <fstream>
namespace WaveGui {
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
using namespace System::Runtime::InteropServices;
using namespace std;
/// <summary>
/// Summary for Form1
/// </summary>
나는 이것을 읽기 쉽도록 편집했다. 그것은 표준 MSVS2010 양식이었습니다. 단추를 하나만 추가하고 파일 대화 상자를 열었습니다. 버튼의 코드에서
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)
{
if(openFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK)
{
//Note: Ask Gustafson how we might free the memory for this strign
// http://support.microsoft.com/?id=311259
char* str2 = (char*)(void*)Marshal::StringToHGlobalAnsi(openFileDialog1->FileName);
SNDFILE* sf = NULL;
SF_INFO info;
/*The following is descriptive information to obtain from wave files. These are declarations*/
int num_channels;
double num, num_items;
double *buf;
int f, sr, c;
int i,j;
FILE *out;
/*This is where the program will open the WAV file */
info.format = 0;
sf = sf_open(str2, SFM_READ, &info);
if(sf == NULL)
{
exit(-1);
}
/*Print some file information */
f = info.frames;
sr = info.samplerate;
c = info.channels;
/*Calculate and print the number of items*/
num_items = f*c;
/*Allocate space for the data to be read*/
buf = (double *) malloc(num_items*sizeof(double));
num = sf_read_double(sf,buf,num_items);
sf_close(sf);
/*Write the data to the filedata.out*/
out = fopen("filedata.txt", "w");
for(i = 0; i < num; i+=c)
{
for(j = 0; j < c; ++j)
{
fprintf(out, "%lf ", buf[i +j]);
}
fprintf(out,"\n");
}
fclose(out);
}
}
};
}
, 나는 일반 문자열에 대한 시스템 문자열로 변환 후 TXT 정보를 내 웨이브 파일을 변환하려면 위의 C++ 코드를 사용하려고합니다. 나는 변환 코드가 작동하는 것을 알고 있으며 버튼 코드가 작동하는지는 별도로 테스트했기 때문에 작동한다는 것을 알고있다. 그러나 지금 사용하려고하면 sndfile.h 라이브러리가 실제로 종료됩니다.
가 내가 추가 할 때 그것은 나를주는 오류가 라이브러리 STDIO.H, WINDOWS.H는 stdlib.h는, iostream이, fstream은 다음입니다
같이
1>WaveGui.obj : error LNK2031: unable to generate p/invoke for "extern "C" int __clrcall sf_close(struct SNDFILE_tag *)" ([email protected]@[email protected]@@Z); calling convention missing in metadata
1>WaveGui.obj : error LNK2031: unable to generate p/invoke for "extern "C" __int64 __clrcall sf_read_double(struct SNDFILE_tag *,double *,__int64)" ([email protected]@[email protected]@[email protected]); calling convention missing in metadata
1>WaveGui.obj : error LNK2031: unable to generate p/invoke for "extern "C" struct SNDFILE_tag * __clrcall sf_open(char const *,int,struct SF_INFO *)" ([email protected]@[email protected]@[email protected]@@Z); calling convention missing in metadata
1>WaveGui.obj : warning LNK4248: unresolved typeref token (01000027) for 'SNDFILE_tag'; image may not run
1>WaveGui.obj : error LNK2028: unresolved token (0A000022) "extern "C" int __clrcall sf_close(struct SNDFILE_tag *)" ([email protected]@[email protected]@@Z) referenced in function "private: void __clrcall WaveGui::Form1::button1_Click(class System::Object ^,class System::EventArgs ^)" ([email protected]@[email protected]@[email protected]@@[email protected]@@Z)
1>WaveGui.obj : error LNK2028: unresolved token (0A000023) "extern "C" __int64 __clrcall sf_read_double(struct SNDFILE_tag *,double *,__int64)" ([email protected]@[email protected]@[email protected]) referenced in function "private: void __clrcall WaveGui::Form1::button1_Click(class System::Object ^,class System::EventArgs ^)" ([email protected]@[email protected]@[email protected]@@[email protected]@@Z)
1>WaveGui.obj : error LNK2028: unresolved token (0A000025) "extern "C" struct SNDFILE_tag * __clrcall sf_open(char const *,int,struct SF_INFO *)" ([email protected]@[email protected]@[email protected]@@Z) referenced in function "private: void __clrcall WaveGui::Form1::button1_Click(class System::Object ^,class System::EventArgs ^)" ([email protected]@[email protected]@[email protected]@@[email protected]@@Z)
1>WaveGui.obj : error LNK2019: unresolved external symbol "extern "C" int __clrcall sf_close(struct SNDFILE_tag *)" ([email protected]@[email protected]@@Z) referenced in function "private: void __clrcall WaveGui::Form1::button1_Click(class System::Object ^,class System::EventArgs ^)" ([email protected]@[email protected]@[email protected]@@[email protected]@@Z)
1>WaveGui.obj : error LNK2019: unresolved external symbol "extern "C" __int64 __clrcall sf_read_double(struct SNDFILE_tag *,double *,__int64)" ([email protected]@[email protected]@[email protected]) referenced in function "private: void __clrcall WaveGui::Form1::button1_Click(class System::Object ^,class System::EventArgs ^)" ([email protected]@[email protected]@[email protected]@@[email protected]@@Z)
1>WaveGui.obj : error LNK2019: unresolved external symbol "extern "C" struct SNDFILE_tag * __clrcall sf_open(char const *,int,struct SF_INFO *)" ([email protected]@[email protected]@[email protected]@@Z) referenced in function "private: void __clrcall WaveGui::Form1::button1_Click(class System::Object ^,class System::EventArgs ^)" ([email protected]@[email protected]@[email protected]@@[email protected]@@Z)
1>c:\users\geekyomega\documents\visual studio 2010\Projects\WaveGui\Debug\WaveGui.exe : fatal error LNK1120: 6 unresolved externals
을 같이 근처에 내가 말할 수있는, 내가 설치 도서관 권리. 결국, 그것은 콘솔 상황에서 이러한 라이브러리를 완벽하게 작동합니다. 그러나 정확한 GUI와 라이브러리를 사용하려고하면 라이브러리가 서로 잘 작동하지 않아서 결과적으로 .h 파일을 읽고 SNDFILE과 같은 구조체에 액세스 할 수없는 것 같습니다. .
누군가가 잘못되어 왔다는 것을 알려주실 수 있습니까? 나는 이것에 시간을 보냈고 libsndfile 라이브러리를 스크랩 할 필요가 없기를 바란다. 나는 GUI와 함께 MSVS2010을 사용하기를 정말로 원합니다. 그리고 제가 말할 수있는 한, 이것이 작동해서는 안되는 이유가 없습니다. 하지만 당신은 그들이 컴퓨터가 거짓말하지 않는다는 것을 알고 있습니다.
언제나처럼 환자의 도움에 감사드립니다. GeekyOmega
: 여기에 P/호출을 사용의 예? 나는 그것을 의도적으로 선택하지 않았다. 이 네이티브 C++ 코드를 GUI로 포팅 테스트하는 아이디어와 함께 사용했습니다. 그래서 마법사의 MSVS2010에서 콘솔 대신 Windows 폼 옵션을 선택했습니다. 거기에 이상한 문제없이 MSVS GUI에서 100 % 기본 코드를 사용하는 방법이 있습니까? 그렇다면 그렇게 할 것입니다. – GeekyOmega
100 % 네이티브로 이동하려면 새 프로젝트를 만들 때 "Win32 프로젝트"템플릿을 선택하십시오. 그런 다음 Win32 응용 프로그램 마법사가 나타나면 "Windows 응용 프로그램"라디오 단추가 선택되어 있는지 확인하십시오. 이전에 Win32 개발을하지 않았다면 학습 곡선이 생길 것입니다. – cbranch
이 질문을 한 번보세요. http://stackoverflow.com/questions/33654914/implementing-extern-winapi-call-in-mfc-c-app please –