фатальная ошибка LNK1127: библиотека повреждена -> после добавления extern "C" к прототипу функции - PullRequest
1 голос
/ 12 октября 2010

У меня есть внешняя библиотека, созданная с использованием кода C.Я хочу вызвать функцию из библиотеки в моем проекте C ++.Первоначальный формат прототипа функции был.

extern void butterThreeBp(real_T eml_dt, real_T eml_fl, real_T eml_fu, real_T eml_b3[7], real_T eml_a3[7]);

И это вызвало следующую ошибку компоновщика в MSVC2008

error LNK2019: unresolved external symbol "void __cdecl butterThreeBp(double,double,double,double * const,double * const)" (?butterThreeBp@@YAXNNNQAN0@Z) referenced in function "public: void __thiscall myThread::setDRNLc(double)" (?setDRNLc@myThread@@QAEXN@Z)

Затем я изменил этот прототип на

extern "C" void ...

и затем получаю следующую ошибку:

\butterThreeBp.lib : fatal error LNK1127: library is corrupt

Я много раз перестраивал библиотеку и был уверен, что она не повреждена.Любая помощь будет отличной.Спасибо !!

Ответы [ 3 ]

2 голосов
/ 13 октября 2010

Вам не нужно использовать включенный компилятор LCC с MATLAB. Самое простое решение - заставить MATLAB использовать VC ++. http://www.mathworks.com/support/compilers/R2010b/index.html

1 голос
/ 13 октября 2010

IIRC вы должны добавлять extern "C" только при компиляции с помощью компилятора C ++.

Что-то в этом роде:

#ifdef __cplusplus
extern "C" {
#endif

// the declarations

#ifdef __cplusplus
}
#endif  
0 голосов
/ 13 октября 2010

Понял!Я сгенерировал код библиотеки, используя встроенный кодер MATLAB, и использовал Lcc встроенного компилятора Matlab для сборки библиотеки.Я работаю над основным приложением в MSVC, поэтому я предполагаю, что между библиотекой (Lcc) и моим основным проектом (MSVC) была некоторая проблема соглашения о вызовах.Эту проблему было особенно трудно обнаружить, потому что одна из моих библиотек (ButterOneLp) работала нормально, хотя она была сгенерирована с использованием Lcc.Однако другая библиотека не работала.

Проблема была исправлена ​​с помощью

mex -setup

.,,Команда в MATLAB и изменение компилятора по умолчанию на MSVC в отличие от Lcc по умолчанию.

Я думаю, что Lcc основан на gcc, так что если кто-нибудь знает, как изменить соглашение о вызовах в коде C ++, чтобы gcc /Библиотеки lcc могут быть вызваны из MSVC, это было бы здорово.Тем не менее, это совершенно другой вопрос по сравнению с оригиналом, который был опубликован.

Мораль этой истории в том, чтобы проверить, что ваша библиотека и вызывающее приложение построены / были созданы с использованием одного и того же компилятора, если вы получили "фатальную ошибку: библиотека повреждена ".

...