Fatal error lnk1120 неразрешенных внешних элементов

What is causing this error? I google'd it and first few solutions I found were that something was wrong with the library and the main function but both seem to be fine in my problem, I even retyped...

What is causing this error? I google’d it and first few solutions I found were that something was wrong with the library and the main function but both seem to be fine in my problem, I even retyped both! What could be causing this?

This might be helpful:

MSVCRTD.lib(crtexew.obj) : error LNK2019: unresolved external symbol WinMain@16 referenced in function __tmainCRTStartup

#include <iostream>
using namespace std;
int main()
{
    const double A = 15.0, 
                 B = 12.0, 
                 C = 9.0;
    double aTotal, bTotal, cTotal, total;
    int numSold;

    cout << "Enter The Number of Class A Tickets Sold: ";
    cin >> numSold;
    aTotal = numSold * A;

    cout << "Enter The Number of Class B Tickets Sold: ";
    cin >> numSold;
    bTotal = numSold * B;

    cout << "Enter The Number of Class C Tickets Sold: ";
    cin >> numSold;
    cTotal = numSold * C;

    total = aTotal + bTotal + cTotal;

    cout << "Income Generated" << endl;
    cout << "From Class A Seats $" << aTotal << endl;
    cout << "From Class B Seats $" << bTotal << endl;
    cout << "From Class C Seats $" << cTotal << endl;
    cout << "-----------------------" << endl;
    cout << "Total Income: " << total << endl;

    return 0;
}

asked Sep 14, 2011 at 2:58

Howdy_McGee's user avatar

Howdy_McGeeHowdy_McGee

10.3k29 gold badges109 silver badges185 bronze badges

3

From msdn

When you created the project, you made the wrong choice of application
type. When asked whether your project was a console application or a
windows application or a DLL or a static library, you made the wrong
chose windows application (wrong choice).

Go back, start over again, go to File -> New -> Project -> Win32
Console Application -> name your app -> click next -> click
application settings.

For the application type, make sure Console Application is selected
(this step is the vital step).

The main for a windows application is called WinMain, for a DLL is
called DllMain, for a .NET application is called
Main(cli::array ^), and a static library doesn’t have a
main. Only in a console app is main called main

answered Sep 14, 2011 at 3:06

Drahakar's user avatar

DrahakarDrahakar

5,9466 gold badges42 silver badges58 bronze badges

1

I incurred this error once.

It turns out I had named my program ProgramMame.ccp instead of ProgramName.cpp

easy to do …

Hope this may help

answered Oct 25, 2012 at 15:58

Bob in SC's user avatar

Bob in SCBob in SC

1411 silver badge2 bronze badges

My problem was
int Main()
instead of
int main()

good luck

answered Nov 21, 2012 at 13:19

Mahika's user avatar

MahikaMahika

6622 gold badges11 silver badges21 bronze badges

Well it seems that you are missing a reference to some library. I had the similar error solved it by adding a reference to the #pragma comment(lib, «windowscodecs.lib»)

answered Apr 25, 2015 at 10:18

G droid's user avatar

G droidG droid

9565 gold badges13 silver badges36 bronze badges

In my case, the argument type was different in the header file and .cpp file. In the header file the type was std::wstring and in the .cpp file it was LPCWSTR.

Dharman's user avatar

Dharman

29.3k21 gold badges80 silver badges131 bronze badges

answered Sep 23, 2020 at 11:18

Vasantha Ganesh's user avatar

Vasantha GaneshVasantha Ganesh

4,4203 gold badges23 silver badges33 bronze badges

You must reference it. To do this, open the shortcut menu for the project in Solution Explorer, and then choose References. In the Property Pages dialog box, expand the Common Properties node, select Framework and References, and then choose the Add New Reference button.

answered Jul 5, 2016 at 10:06

Amir Touitou's user avatar

Amir TouitouAmir Touitou

3,0011 gold badge35 silver badges31 bronze badges

I have faced this particular error when I didn’t defined the main() function. Check if the main() function exists or check the name of the function letter by letter as Timothy described above or check if the file where the main function is located is included to your project.

answered Sep 21, 2016 at 9:02

funk's user avatar

funkfunk

2,1111 gold badge22 silver badges22 bronze badges

1

In my particular case, this error error was happening because the file which I’ve added wasn’t referenced at .vcproj file.

answered Nov 19, 2019 at 16:32

dbz's user avatar

dbzdbz

3817 silver badges22 bronze badges

In my case I got this error when I had declared a function under ‘public’ access specifier. Issue got resolved when I declared that function as private.

answered Mar 11, 2021 at 18:12

explorer2020's user avatar

I have encountered the same error. For me it turned out to be because I tried to implement an inline function in the .cpp file, instead of putting it in the header file, where the definition is. Therefore when I tried to include the header file and use the function, I got this error.

answered Nov 25, 2021 at 22:56

Kirk KD's user avatar

My case: I defined a prototype of the class de-constructor, but forgot to define the body.

class SomeClass {
    ~SomeClass(); //error
};

class SomeClass {
    ~SomeClass(){}; //no error
}

answered Jul 9, 2022 at 4:23

ChrisQIU's user avatar

In my case I had forgotten to add the main() function altogether.

answered Jul 29, 2022 at 5:34

Fractal Salamander's user avatar

Содержание

  1. Помогите с ошибками LNK2019 LNK1120
  2. LNK1120: 1 неразрешенный внешний вид и LNK2019: неразрешенный внешний символ
  3. Решение
  4. Другие решения
  5. Fatal error lnk1120 неразрешенных внешних элементов 10
  6. Лучший отвечающий
  7. Вопрос
  8. Ответы
  9. Все ответы
  10. C++ фатальная ошибка LNK1120: 1 неразрешенные внешние
  11. 6 ответов
  12. Fatal error lnk1120 неразрешенных внешних элементов 10

Помогите с ошибками LNK2019 LNK1120

Периодически сталкиваюсь с проблемой линкера
Лог приведен ниже. Проблема явно в моем не знании природы ошибки, кому не сложно объясните вкратце.

1>DXUTcamera.obj : error LNK2019: ссылка на неразрешенный внешний символ «long __stdcall DXUTCreateArrowMeshFromInternalArray(struct IDirect3DDevice9 *,struct ID3DXMesh * *)» (?DXUTCreateArrowMeshFromInternalArray@@YGJPAUIDirect3DDevice9@@PAPAUID3DXMesh@@@Z) в функции «public: static long __stdcall CDXUTDirectionWidget::StaticOnD3D9CreateDevice(struct IDirect3DDevice9 *)» (?StaticOnD3D9CreateDevice@CDXUTDirectionWidget@@SGJPAUIDirect3DDevice9@@@Z)
1>DebugEmptyProject10.exe : fatal error LNK1120: 1 неразрешенных внешних элементов

msdn прочитал, все что понял что вызываю функцию которая «не разрешена» что это значит? как ее разрешитЬ? я все проинклюдил, причем в том что проинклюдил эта функция есть.

ExcIuZive
> я все проинклюдил, причем в том что проинклюдил эта функция есть.
А cpp файлы или lib где есть описание этих функций подсоеденил?
> msdn прочитал, все что понял что вызываю функцию которая «не разрешена» что это значит?
Эта ошибка означает что функция объявлена, но линковщик не может отыскать ее описание

cpp и h файлы добавил в прокет (VS2010)
проинклудил h файл
а библиотеки.. ну только которые изначально d3d10.lib и d3dx10.lib. То есть все компилилось, начал прикручивать камеру через DXUT и вылезла вот эта ошибка.

Источник

LNK1120: 1 неразрешенный внешний вид и LNK2019: неразрешенный внешний символ

Я получаю эти две ошибки, и я не могу найти решение, которое работает.

LNK1120: 1 неразрешенное внешнее

Ошибка 1 ошибка LNK2019: неразрешенный внешний символ «public: __thiscall Vector3D :: Vector3D (класс Vector3D const &) «(?? 0Vector3D @@ QAE @ ABV0 @@ Z) ссылка на функцию» public: класс Vector3D __thiscall Vertex :: GetPosition (void) «(? GetPosition @ Vertex @@ QAE? AVVector3D @@ XZ)

Я думаю, что это связано с моим оператором Matrix и конструктором в моем классе Vector 3d
Любая помощь будет высоко ценится, так как я новичок в C ++

Решение

Это говорит о том, что компоновщик не может найти реализацию Vector3D(const Vector3D& rhs); , Этот конструктор объявлен в вашем векторном классе, но не определен.

У вас есть реализация конструктора где-то в .cpp файл, а этот файл известен вашему компилятору?

Компиляция C / C ++ работает так: сначала у вас есть несколько так называемых «модулей компиляции» — обычно каждый .cpp -file является одним из таких модулей компиляции. Ваша программа состоит из всех этих отдельных модулей, связанных друг с другом (процесс «связывания» происходит после компиляции). Каждая функция, которая вызывается где-то, должна быть определена ровно один раз в некотором модуле компиляции, если он не определен встроенным (как другие методы вашего класса). Если метод объявлен, но не определен, компилятор не будет жаловаться — только компоновщик. Представьте себе блоки компиляции, имеющие «розетки» и «соединители», которые соответствуют соответствующим «розеткам» других блоков. Процесс компиляции просто создает эти модули, принимая определенную форму «сокета» (как указано в объявлениях), тогда как компоновщик фактически пытается соединить каждый «сокет» с его «соединителем». Итак, вы видите, как процесс компиляции может быть успешным, но ссылки нет.

Ошибки компоновщика могут быть сложно решить, особенно если вы еще не так опытны. Там может быть много причин для них:

  • Отсутствует реализация / определение
  • Определение существует, но почему-то не компилируется (потому что файл не передается компилятору и т. Д.)
  • Различные версии библиотек и т. Д.

И многое другое ..

Редактировать: Кроме того, вы должны передать вектор по константной ссылке и создать newVector, вызвав его конструктор, вместо создания объекта по умолчанию и последующего присвоения. И окончательное строительство в return statement тоже не нужен. Улучшенный код:

Другие решения

Ваша реализация Vector3D кажется, что отсутствует фактическая реализация для конструктора копирования, следовательно, неразрешенная внешняя ошибка. Если вы не собираетесь копировать объект Vector3D, вы не сможете передать его в Matrix::operator* по значению, что бы вызвать копию.

Тем не менее, я не думаю, что есть какие-либо причины объявлять и реализовывать конструктор копирования для Vector3D в любом случае, поскольку он содержит только POD-типы, и сгенерированный компилятором конструктор копирования будет работать нормально. То же самое относится и к деструктору, ресурсы для управления отсутствуют, поэтому пусть компилятор выполняет свою работу.

Вы реализовали Vector3D конструктор по умолчанию, конструктор копирования и деструктор? Вы показали свои заголовки, но не файлы реализации. Линкер жалуется на отсутствие определения Vector3D::Vector3D(Vector3D const&) ,

Источник

Fatal error lnk1120 неразрешенных внешних элементов 10

Лучший отвечающий

Вопрос

пытаюсь создать DLL, два файла MyLib.cpp

и файл main.def с содержимым

При компиляции с параметром /MD никаких ошибок не возникает.

При компиляции с параметром /MT выдает ошибки:

Ошибка 4 error LNK2001: неразрешенный внешний символ «Delete»
Ошибка 5 error LNK1120: неразрешенных внешних элементов: 1

При этом, если изменить Delete на Delete2, никаких ошибок не возникает.

как это исправить?

Ответы

Экспорт идентификаторов из DLL может быть выполнен двумя способами: через файл определения модуля (DEF) и модификаторами __declspec(dllexport). Второй способ более гибкий, т.к. имя функции «декорируется», т.е. добавляется информация о классе, пространстве имен и проч. Однако затрудняет явный поиск имени в разделе экспорта (т.к. только компилятор знает, какое имя в результате получится).

При использовании DEF-файла в раздел экспорта попадает лишь имя функции (без искажений), поэтому такое имя должно быть уникальным по всей DLL.

Можно сделать так: уберите из проекта DEF-файл, а определение функции перепишите в таком виде:

Т.е. функция должна вызываться по соглашению __cdecl, а extern «C» выключит декорирование ее имени.

Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

Все ответы

При этом, если изменить Delete на Delete2, никаких ошибок не возникает.

Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

При этом, если изменить Delete на Delete2, никаких ошибок не возникает.

Где изменить? У Вас def-файл имеет неверный формат. Имена экспортируемых функций должны записываться с отступом (не с первой позиции строки) и никакой точки с запятой в конце ставить не нужно.

Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

Нет, не пробовал. Просто я не одну dll за свою жизнь написал и знаю формат def-файла.

Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

Ну, так попробовал 🙂 Что же Вы не показали весь лог, а ограничились только двумя последними строчками? А он, между тем, выглядит так:

1>main.def : warning LNK4022: не удается найти уникальное соответствие для символа «Delete»

1>main.def : warning LNK4002: «void __fastcall Delete(void *)» (?Delete@@YIXPAX@Z) определен в ReleaseMyLib.obj

1>main.def : warning LNK4002: «public: bool __thiscall Concurrency::details::Hash ::Delete(class Concurrency::details::_TaskCollection * const &)» (?Delete@?$Hash@PAV_TaskCollection@details@Concurrency@@PAV123@@details@Concurrency@@QAE_NABQAV_TaskCollection@23@@Z) определен в C:Program Files (x86)Microsoft Visual Studio 12.0VClibLIBCMT.lib

1>main.def : error LNK2001: неразрешенный внешний символ «Delete»

1>MyLib.lib : fatal error LNK1120: неразрешенных внешних элементов: 1

По моему, все понятно написано. Ключ /MT включил использование статической библиотеки C++, в которой уже есть функция с именем Delete. В данном случае не важно, что она является методом класса, а не глобальной. Поэтому редактор связей не может создать в Вашей DLL правильный раздел экспорта.

Если непременно нужна статическая библиотека C++, имя функции придется изменить.

Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

Источник

C++ фатальная ошибка LNK1120: 1 неразрешенные внешние

что вызывает эту ошибку? Я google это и первые несколько решений, которые я нашел, были что-то не так с библиотекой и основной функцией, но оба, похоже, в моей проблеме, я даже перепечатал оба! Что могло быть причиной этого?

Это может быть полезно:

библиотеки msvcrtd.lib (crtexew.obj): ошибка LNK2019: неразрешенный внешний символ WinMain@16 ссылается в функции __tmainCRTStartup

6 ответов

когда вы создали проект, вы сделали неправильный выбор приложения тип. Когда вас спросят, был ли ваш проект консольным приложением или приложение windows или DLL или статическая библиотека, вы сделали неправильно выберите приложение windows (неправильный выбор).

вернуться, начать сначала, перейдите в Файл — > Создать — > Проект — > Win32 Консольное приложение — > имя вашего приложения — > нажмите кнопку Далее — > нажмите приложение настройки.

для типа приложения убедитесь, что выбрано консольное приложение (этот шаг является жизненно важным шагом).

основной для приложения windows называется WinMain, для DLL называется DllMain, для приложения .NET называется Main (cli::array^), и статическая библиотека не имеет главный. Только в консольном приложении main называется main

однажды я допустил эту ошибку.

оказывается, я назвал свою программу ProgramMame.КПК вместо ProgramName.cpp

надеюсь, это может помочь

моя проблема была int Main () вместо int main ()

Ну, похоже, вам не хватает ссылки на какую-то библиотеку. У меня была аналогичная ошибка, решив ее, добавив ссылку на #Pragma comment (lib, «windowscodecs.lib»)

вы должны ссылаться на него. Для этого откройте контекстное меню проекта в обозревателе решений и выберите пункт ссылки. В диалоговом окне страницы свойств разверните узел общие свойства, выберите структура и ссылки, а затем нажмите кнопку Добавить новую ссылку.

Я столкнулся с этой конкретной ошибкой, когда я не определил функцию main (). Проверьте, существует ли функция main (), или проверьте имя функции буква за буквой, как описано выше Тимоти, или проверьте, включен ли файл, в котором находится основная функция, в ваш проект.

Источник

Fatal error lnk1120 неразрешенных внешних элементов 10

1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
FAQ Раздела Обновления для FAQ Раздела Поиск по Разделу MSDN Library Online

Возникло желание избавится от зависимости от распространяемого пакета стандартных библиотек.
То есть сделать программу, в старом добром стиле, «всё сама».

Это просто сделать, взяв Assembler или даже C.
С C++ сложнее. Нужно брать что-то старое. К примеру visual studio 6. А может даже и старше.

Но я взял visual studio 2010. Причём именно C++. Ну вот нравятся мне те плюшки, которые в него добавили после 1998 года.

компилирую:
cl.exe /c /Od /WX /GS /GR /Zi /Zl /EHa /RTCs test.cpp /Fotest.obj > compile.log 2>&1
Всё ок. Получаю test.obj

линкую:
link.exe /debug test.obj /out:test.exe > link.txt 2>&1

Microsoft ® Incremental Linker Version 10.00.40219.01
Copyright © Microsoft Corporation. All rights reserved.

test.obj : error LNK2001: неразрешенный внешний символ «__RTC_Shutdown»
test.obj : error LNK2001: неразрешенный внешний символ «__RTC_InitBase»
LINK : error LNK2001: неразрешенный внешний символ «_mainCRTStartup»
test.exe : fatal error LNK1120: 3 неразрешенных внешних элементов

Наблюдаются сразу две проблемы!

Вторая это точка входа. Он видетели ждёт «_mainCRTStartup».
Исправляем прогу:

А первая. Это проверка стека.
Прощаемся с ключиком «/GS».
Компиляция, линковка:
cl.exe /c /Od /WX /GR /Zi /Zl /EHa /RTCs test.cpp /Fotest.obj > compile.log 2>&1
link.exe /debug test.obj /out:test.exe > link.txt 2>&1

Microsoft ® Incremental Linker Version 10.00.40219.01
Copyright © Microsoft Corporation. All rights reserved.

LINK : fatal error LNK1561: точка входа должна быть определена

Это так же понятно как лечить. Хоя, чего тогда искал _mainCRTStartup. А когда дал, развонялся?
Ладно, линкую заного:
link.exe /debug /entry:_mainCRTStartup test.obj /out:test.exe > link.txt 2>&1

Microsoft ® Incremental Linker Version 10.00.40219.01
Copyright © Microsoft Corporation. All rights reserved.

LINK : fatal error LNK1221: подсистема не может быть логически выведена, а должна быть определена

А сразу не мог сказать?!
Проблема решаема, опять линкую:
link.exe /debug /entry:_mainCRTStartup /subsystem:console test.obj /out:test.exe > link.txt 2>&1

И вновь не идёт:

Microsoft ® Incremental Linker Version 10.00.40219.01
Copyright © Microsoft Corporation. All rights reserved.

test.obj : error LNK2001: неразрешенный внешний символ «__RTC_Shutdown»
test.obj : error LNK2001: неразрешенный внешний символ «__RTC_InitBase»
test.exe : fatal error LNK1120: 2 неразрешенных внешних элементов

Прощаюсь с ключиком «/RTCs»
Перекомпилирую, линкую:
cl.exe /c /Od /WX /GR /Zi /Zl /EHa test.cpp /Fotest.obj > compile.log 2>&1
link.exe /debug /entry:_mainCRTStartup /subsystem:console test.obj /out:test.exe > link.txt 2>&1

Microsoft ® Incremental Linker Version 10.00.40219.01
Copyright © Microsoft Corporation. All rights reserved.

LINK : fatal error LNK1104: не удается открыть файл «test.exe»

А это уже хулиганит антивирус. Хе-хе!
Пишу в саппорт. Как я искал адрес их электронной почты, отдельная сага.
Пью кофе. Проверяю почту. Ответа нет.
Жму обновится в антивире. Но ничего нового.
Эти $@# меня проигнорировали!
Написать ещё раз и обматерить их что ли? А может они там заняты? Эх, с кем я связался-то?
Вместо того, чтобы отвечать на мои запросы, наверное бухают и секретуток зажимают поуглам.
Ладно, добавляем диск в исключение. Если словлю на него вирус, то виноват будет саппорт.

Компилю, линкую и о радость!

Ндяс. А какой смысл в этой проге?
Придётся добавлять смысл.

В любой нормальной системе, даже голой, есть эти функции. Так что могу обращатся к ним.
cl.exe /c /Od /WX /GR /Zi /Zl /EHa test.cpp /Fotest.obj > compile.log 2>&1
link.exe /debug /entry:_mainCRTStartup /subsystem:console test.obj /out:test.exe Kernel32.lib > link.txt 2>&1

Теперь запускаю и получаю:

Операция успешно завершена.

Для продолжения нажмите любую клавишу . . .

Здорово?! А вот и нет!

Небольшое усложнение, для проверки:

Компилирую, линкую и:

Microsoft ® Incremental Linker Version 10.00.40219.01
Copyright © Microsoft Corporation. All rights reserved.

test.obj : error LNK2019: ссылка на неразрешенный внешний символ ___security_cookie в функции «void __cdecl _mainCRTStartup(void)» (?_mainCRTStartup@@YAXXZ)
test.obj : error LNK2019: ссылка на неразрешенный внешний символ ___CxxFrameHandler3 в функции __ehhandler$?_mainCRTStartup@@YAXXZ
test.obj : error LNK2019: ссылка на неразрешенный внешний символ @__security_check_cookie@4 в функции __ehhandler$?_mainCRTStartup@@YAXXZ
test.obj : error LNK2001: неразрешенный внешний символ «»const type_info::`vftable’» (??_7type_info@@6B@)»
test.obj : error LNK2019: ссылка на неразрешенный внешний символ «void __cdecl operator delete(void *)» (??3@YAXPAX@Z) в функции «public: virtual void * __thiscall console_output::`scalar deleting destructor'(unsigned int)» (??_Gconsole_output@@UAEPAXI@Z)
LINK : error LNK2001: неразрешенный внешний символ «__load_config_used»
test.exe : fatal error LNK1120: 6 неразрешенных внешних элементов

Ладно, попрощаемся с ключеком «/EHa «.

Microsoft ® Incremental Linker Version 10.00.40219.01
Copyright © Microsoft Corporation. All rights reserved.

test.obj : error LNK2001: неразрешенный внешний символ «»const type_info::`vftable’» (??_7type_info@@6B@)»
test.obj : error LNK2019: ссылка на неразрешенный внешний символ «void __cdecl operator delete(void *)» (??3@YAXPAX@Z) в функции «public: virtual void * __thiscall console_output::`scalar deleting destructor'(unsigned int)» (??_Gconsole_output@@UAEPAXI@Z)
test.exe : fatal error LNK1120: 2 неразрешенных внешних элементов

А если убрать и ключик «/GR», но нет, всё то же.

Там ещё и операторы new, delete надо будет перегружать. Но это конечно не проблема.

А вот откуда и что такое это «const type_info::`vftable’» (??_7type_info@@6B@)»

Это ведь класс?
Как его перегрузить?

Где взять исходники стандартной библиотеки, чтоб поковырятся?

Ни с какими ключиками не игрался, ничего не перегружал, в исходниках RTL не копался.

Источник

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
/* *********************************************************************
 * Copyright (c) 2007 VMware, Inc.
 * All rights not expressly granted to you by VMware, Inc. are reserved.
 * *********************************************************************/
 
/* This demonstrates how to open a virtual machine, create
 * a snapshot, and revert the snapshot. The virtual machine
 * will remain powered on at the end of this program.
 *
 * This uses the VixJob_Wait function to block after starting each
 * asynchronous function. This effectively makes the asynchronous
 * functions synchronous, because VixJob_Wait will not return until the
 * asynchronous function has completed.
 */
 
#include <stdio.h>
#include <stdlib.h>
 
#include "vix.h"
 
 
/*
 * Certain arguments differ when using VIX with VMware Server 2.0
 * and VMware Workstation.
 *
 * Comment out this definition to use this code with VMware Server 2.0.
 */
#define USE_WORKSTATION
 
#ifdef USE_WORKSTATION
 
#define  CONNTYPE    VIX_SERVICEPROVIDER_VMWARE_WORKSTATION
 
#define  HOSTNAME ""
#define  HOSTPORT 0
#define  USERNAME ""
#define  PASSWORD ""
 
#define  VMPOWEROPTIONS   VIX_VMPOWEROP_LAUNCH_GUI   // Launches the VMware Workstaion UI
                                                     // when powering on the virtual machine.
 
#define VMXPATH_INFO "where vmxpath is an absolute path to the .vmx file " 
                     "for the virtual machine."
 
#else    // USE_WORKSTATION
 
/*
 * For VMware Server 2.0
 */
 
#define CONNTYPE VIX_SERVICEPROVIDER_VMWARE_VI_SERVER
 
#define HOSTNAME "https://192.2.3.4:8333/sdk"
/*
 * NOTE: HOSTPORT is ignored, so the port should be specified as part
 * of the URL.
 */
#define HOSTPORT 0
#define USERNAME "root"
#define PASSWORD "hideme"
 
#define  VMPOWEROPTIONS VIX_VMPOWEROP_NORMAL
 
#define VMXPATH_INFO "where vmxpath is a datastore-relative path to the " 
                     ".vmx file for the virtual machine, such as "        
                     ""[standard] ubuntu/ubuntu.vmx"."
 
#endif    // USE_WORKSTATION
 
 
/*
 * Global variables.
 */
 
static char *progName;
 
 
/*
 * Local functions.
 */
 
////////////////////////////////////////////////////////////////////////////////
static void
usage()
{
   fprintf(stderr, "Usage: %s <vmxpath>n", progName);
   fprintf(stderr, "%sn", VMXPATH_INFO);
}
 
 
////////////////////////////////////////////////////////////////////////////////
int
main(int argc, char **argv)
{
    VixError err;
    char *vmxPath;
    VixHandle hostHandle = VIX_INVALID_HANDLE;
    VixHandle jobHandle = VIX_INVALID_HANDLE;
    VixHandle vmHandle = VIX_INVALID_HANDLE;
    VixHandle snapshotHandle = VIX_INVALID_HANDLE;
    int numSnapshots;
 
    progName = argv[0];
    if (argc > 1) {
        vmxPath = argv[1];
    } else {
        usage();
        exit(EXIT_FAILURE);
    }
 
    jobHandle = VixHost_Connect(VIX_API_VERSION,
                                CONNTYPE,
                                HOSTNAME, // *hostName,
                                HOSTPORT, // hostPort,
                                USERNAME, // *userName,
                                PASSWORD, // *password,
                                0, // options,
                                VIX_INVALID_HANDLE, // propertyListHandle,
                                NULL, // *callbackProc,
                                NULL); // *clientData);
    err = VixJob_Wait(jobHandle, 
                      VIX_PROPERTY_JOB_RESULT_HANDLE, 
                      &hostHandle,
                      VIX_PROPERTY_NONE);
    if (VIX_FAILED(err)) {
        goto abort;
    }
 
    Vix_ReleaseHandle(jobHandle);
    jobHandle = VixVM_Open(hostHandle,
                           vmxPath,
                           NULL, // VixEventProc *callbackProc,
                           NULL); // void *clientData);
    err = VixJob_Wait(jobHandle, 
                      VIX_PROPERTY_JOB_RESULT_HANDLE, 
                      &vmHandle,
                      VIX_PROPERTY_NONE);
    if (VIX_FAILED(err)) {
        goto abort;
    }
    Vix_ReleaseHandle(jobHandle);
 
    err = VixVM_GetNumRootSnapshots(vmHandle, &numSnapshots);
    if (VIX_FAILED(err)) {
        goto abort;
    }
 
    if (numSnapshots == 0) {
       /*
        * If there is not already a snapshot, create a new one, with the
        * virtual machine powered on.
        */
       jobHandle = VixVM_PowerOn(vmHandle,
                                 VMPOWEROPTIONS,
                                 VIX_INVALID_HANDLE,
                                 NULL, // *callbackProc,
                                 NULL); // *clientData);
       err = VixJob_Wait(jobHandle, VIX_PROPERTY_NONE);
       if (VIX_FAILED(err)) {
          goto abort;
       }
       
       Vix_ReleaseHandle(jobHandle);
       
       /*
        * Since the virtual machine is running, passing the 
        * VIX_SNAPSHOT_INCLUDE_MEMORY flag will make VixVM_CreateSnapshot()
        * save the run-time state of the machine, and not just the disk state.
        */
       jobHandle = VixVM_CreateSnapshot(vmHandle,
                                        "snapshotName",
                                        "snapshotDescription",
                                        VIX_SNAPSHOT_INCLUDE_MEMORY,
                                        VIX_INVALID_HANDLE,
                                        NULL, // *callbackProc,
                                        NULL); // *clientData);
       err = VixJob_Wait(jobHandle, 
                         VIX_PROPERTY_JOB_RESULT_HANDLE,
                         &snapshotHandle,
                         VIX_PROPERTY_NONE);
       if (VIX_FAILED(err)) {
          goto abort;
       }
       
       Vix_ReleaseHandle(jobHandle);
       jobHandle = VixVM_PowerOff(vmHandle,
                                  VIX_VMPOWEROP_NORMAL,
                                  NULL, // *callbackProc,
                                  NULL); // *clientData);
       err = VixJob_Wait(jobHandle, VIX_PROPERTY_NONE);
       if (VIX_FAILED(err)) {
          goto abort;
       }
       Vix_ReleaseHandle(jobHandle);
       
       /*
        * Release the handle before it gets overwritten when we call
        * VixVM_GetRootSnapshot().
        */
       Vix_ReleaseHandle(snapshotHandle);
       snapshotHandle = VIX_INVALID_HANDLE;
 
    }
 
    err = VixVM_GetRootSnapshot(vmHandle, 0, &snapshotHandle);
    if (VIX_FAILED(err)) {
        goto abort;
    }
    /*
     * Here we pass VMPOWEROPTIONS to RevertToSnapshot since we
     * took a snapshot of a powered on virtual machine, and the
     * virtual machine will then be powered on again when we revert.
     */
    jobHandle = VixVM_RevertToSnapshot(vmHandle, 
                                       snapshotHandle,
                                       VMPOWEROPTIONS, // options,
                                       VIX_INVALID_HANDLE,
                                       NULL, // *callbackProc,
                                       NULL); // *clientData);
    err = VixJob_Wait(jobHandle, VIX_PROPERTY_NONE);
    if (VIX_FAILED(err)) {
        goto abort;
    }
 
 
abort:
    Vix_ReleaseHandle(jobHandle);
    Vix_ReleaseHandle(vmHandle);
    Vix_ReleaseHandle(snapshotHandle);
 
    VixHost_Disconnect(hostHandle);
 
    return 0;
}

Понравилась статья? Поделить с друзьями:

Читайте также:

  • Fatal error lnk1120 1 unresolved externals masm
  • Fatal error lnk1113 invalid machine type
  • Fatal error lnk1112 тип компьютера модуля x64 противоречит типу целевого компьютера x86
  • Fatal error lnk1112 module machine type x86 conflicts with target machine type x64
  • Fatal error lnk1107

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии