Подтвердить что ты не робот

Как статически ссылаться на link.exe

Я пытаюсь статически связать с библиотекой С++ под Poco в Windows с помощью инструментов командной строки Visual Studio 2008.

Я создаю свою программу с помощью

cl /I..\poco\lib /c myapp.cpp
link /libpath:..\poco\lib myapp.obj PocoNet.lib

Это приводит к тому, что exe для выполнения требует PocoNet.dll и PocoFoundation.dll.

Я потратил некоторое время на чтение ссылок на Windows и узнал, что cl /MT статически ссылается на стандартную библиотеку, а cl /MD - динамически.

Я попытался указать /MT, но это ничего не изменило; моему приложению все еще требуются DLL Poco. (Я также подозреваю, что /MT является поведением по умолчанию.)

Посмотрев под ..\poco\lib, я обнаружил, что есть также PocoNetmt.lib, но указав, что вместо PocoNet.lib произошла куча ошибок LNK2005 ( "уже определена" ):

msvcprt.lib(MSVCP90.dll) : error LNK2005: "public: __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::~basic_string<char,struct std::char_traits<char>,class std::allocator<char> >(void)" ([email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]) already defined in exp.obj

Затем я попытался выполнить стекирование на большее количество флагов:

Я также пробовал некоторые комбинации из вышеперечисленного, все безрезультатно.

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

4b9b3361

Ответ 1

Вы должны определить POCO_STATIC в командной строке и связать как PocoFoundationmt, так и PocoNetmt.lib:

C:\test > cl/MD/WX/nologo/EHsc/DPOCO_STATIC/DUNICODE/D_UNICODE/I..\poco ||Foundation\include/I..\poco\Net\include/c exp.cpp

exp.cpp

C:\test > ссылка /libpath:..\poco\lib/WX/nologo exp.obj PocoNetmt.lib PocoFoundationmt.lib

[ОБНОВЛЕНИЕ] Если вы компилируете /DPOCO _STATIC, тогда нет необходимости указывать библиотеки POCO в командной строке компоновщика. Заголовочные файлы содержат инструкции #pragma comment (lib, "PocoXXXmt.lib" ), которые должны обеспечивать связь всех необходимых библиотек.

Если вы не компилируете /DPOCO _STATIC, тогда библиотеки импорта DLL будут автоматически связаны. [/ОБНОВЛЕНИЕ]

Ответ 2

Похоже, проблема в том, что файл PocoNet.lib является библиотекой импорта для poco.dll. Таким образом, externs, котор он разрешает к DLL.

Вам нужно будет найти или создать статическую библиотеку для Poco (если возможно).

Ответ 3

Вам понадобится /MT для вашего кода и всех его зависимостей, чтобы статически ссылаться на среду выполнения MSVC (MSVCP90.dll/MSVCR90.dll).

Это потому, что PocoNetmt.lib создается с помощью /MT.

Если с /MT вы все равно получите msvcprt.lib, включите /verbose и узнайте, какая другая библиотека перетаскивает его. Затем перекомпилируйте/найдите статическую сборку.

Другой вариант - найти статический PocoNet lib, который построен с помощью /MD (поэтому вы ставите его статически, но динамически во время выполнения) и переключите все на /MD.

EDIT: Когда Poco dll связан с /MT, который не влияет на вас. Но поскольку вы хотите избавиться от него, вам (и всем вашим другим зависимостям) придется использовать тот же флаг/MT.

Ответ 4

POCO >= 1.4.0 поддержка статическая с статическая среда выполнения (и все еще статическая с динамическим временем выполнения)

https://raw.github.com/pocoproject/poco/poco-1.4.5/CHANGELOG (поиск "debug_static_mt" )

не забудьте определить POCO_STATIC при включении заголовков poco