Ошибка компоновщика: уже определена в моем проекте, когда я ее вообще не определяю - PullRequest
2 голосов
/ 22 декабря 2010

Я пытаюсь создать проект C в Visual C ++ 2010 Express как C ++, чтобы я мог создать оболочку .net C ++ / CLI для него. Он компилируется нормально, но компоновщик говорит мне, что swprintf (...), vswprintf (...), _swprintf_l (...) и _vswprintf (...) уже определены. Странно то, что в нем говорится, что они уже определены в файле .obj, который я создал, и я уверен, что не определил их. На самом деле, я даже не звоню ни одному из них. Кто-нибудь знает, что может быть причиной этого?

Некоторые уточнения: Эта библиотека написана на простом C и встроена в OS X, FreeBSD, OpenBSD и Linux. Портировать его в Windows как сборку .net - непростая задача. Я читал, что библиотеки C должны быть встроены в C ++, чтобы получить оболочку C ++ / CLI. Чтобы заставить его работать как проект на C ++, мне пришлось сделать несколько настроек (например, приведение к malloc), но он все равно должен поддерживать совместимость с C.

* ФИНАЛЬНОЕ ОБНОВЛЕНИЕ *

Я не знаю, сколько часов я потратил, пытаясь создать оболочку .net для библиотеки анализа файлов, которую я пишу. Я пробовал это несколько раз, и каждый раз это терпит неудачу. На этот раз я продвинулся дальше, чем когда-либо прежде, но все еще не мог заставить его работать.

То, что я первоначально предполагал, было решением для 3 проектов:

  1. неуправляемая статическая библиотека, встроенная в C
  2. управляемая оболочка .net, встроенная в C ++ / CLI
  3. управляемое приложение winforms, встроенное в C #

Я быстро понял, что экспресс-выпуски Visual Studio дают вам именно то, за что вы платите, и не позволяют смешивать проекты разных языков в одном решении. Чтобы сделать это, я должен был бы заплатить 800 долларов за VS Pro, а этого НЕ происходит!

Я приспособился к этому, решив написать простое приложение на C ++ / CLI. Тем не менее, это просто не будет работать. По-видимому, я должен был бы либо связать файлы .obj из части 1 (которая не работает, потому что не может скомпилировать файлы C с помощью / clr), либо собрать часть 2 с помощью / clr: safe (которая создала все виды других проблем) .

Я действительно не знаю, является ли это ограничением бесполезных Express-версий VS или возможно ли это даже с нелепо дорогими версиями (странно, что 800 долларов дают вам VS Pro, но 700 долларов дают вам весь XCode и Mac Mini для запуска на! Microsoft Dev Tax any?!?) но в любом случае, с меня хватит. Моя библиотека прекрасно работает в OS X, FreeBSD, OpenBSD, Linux и OpenSolaris, но не в Windows, и до тех пор, пока MS не выпустит бесплатные инструменты разработки, которые действительно полезны и фактически предоставляют способ использовать ПОРТАТИВНЫЙ код (это работает в), я только что выиграл все равно.

Спасибо всем, кто давал советы и пытался помочь.

Jorj

Ответы [ 5 ]

1 голос
/ 22 декабря 2010

Вы можете проверить, что все ваши проекты и файлы используют одну и ту же общую библиотеку времени выполнения (Свойства | C \ C ++) и проверить параметр библиотеки времени выполнения. Включение как многопоточной библиотеки DLL отладки (\ MDd), так и многопоточной библиотеки DLL (\ MD) или другого подобного смешения с библиотеками CRT может вызвать что-то подобное.

Можете ли вы опубликовать вывод компоновщика? упоминается ли что-нибудь о \ NODEFAULTLIB?

0 голосов
/ 22 декабря 2010

@ sirjorj-- swprintf определен в wchar.h. Какие заголовки у вас # в том числе?

0 голосов
/ 22 декабря 2010

Поскольку они автоматически включаются в ссылки времени выполнения CRT vs2010 на.

Если вы попытаетесь экспортировать функцию, которая обволакивает эти вещи, возможно, добавьте в префикс c_?

0 голосов
/ 22 декабря 2010

вы можете использовать опцию preprocess-to-file.Это быстро скажет вам, откуда взялась функция!

Может быть, вы используете их _tcs-версии?

0 голосов
/ 22 декабря 2010

Это обычно вызывается связыванием объектов, созданных с использованием разных параметров или разных библиотек времени выполнения. Я предполагаю, что некоторые из ваших объектов были скомпилированы с включенными параметрами отладки, а другие нет или что-то подобное.

...