VS2005: unresolved external symbol

Dmitriy82

В программе я использую стороннюю библиотеку, предварительно
скомпилированную по инструкции командой nmake.
Подключается она директивой
#pragma comment( lib, "glpk.lib"
а также просто добавлена в проект.
При линковке выводится соответствующая ошибка. Подозреваю, что
дело не в библиотеке (ранее та же самая проблема была
с библиотекой векторов от nvidia). Кстати, "решить" можно
было путем добавления в проект исходников всей библиотеки.
Что я делаю неправильно?
Error 38 error LNK2019: unresolved external symbol "void __cdecl glp_lpx_delete_prob(struct LPX *)" (?glp_lpx_d@@@Z) referenced in function _main prototypeGLPK.obj

bobby

Компилировал библиотеку этим же компилятором?

Dmitriy82

Библиотеку - с помощью nmake из vs2005,
свою программу - из среды vs2005.

laki

Error 38 error LNK2019: unresolved external symbol "void __cdecl glp_lpx_delete_prob(struct LPX *)" (?glp_lpx_d@@@Z) referenced in function _main prototypeGLPK.obj
такая ошибка может возникнуть что компилятор не правильно имя генерит.
напиши как ты функцию в либине объявляешь

Dmitriy82

В заголовочных файлах:
#define lpx_delete_prob glp_lpx_delete_prob
...
void lpx_delete_prob(LPX *lp);
В c-шном то же самое:
void lpx_delete_prob(LPX *lp)
{
...

laki

а теперь найди эту функцию в либине
имя у нее будет _glp_lpx_d{магический набор цифр и букв} или что-то такое

laki

для дллек проходит следующее
extern "C" void __declspec(dllexport) __stdcall somefuncname(int k)
и прописыванием имя в файле .def
для либин читать нужно

bobby

ваще-та, если файл компилируется как исходник на C (а такое по умолчанию для файлов с расширением .c то манглинга имен не происходит, и в либе будут нормальные красивые имена.

bobby

о!
зато, когда чувак пытается юзать эти функции из C++-файла, линкер ищет по'mangle'нные имена. Т.о. в .h-шниках либы все-таки надо писать
extern "C"
, но не для сборки либы, а для сборки использующего либу проекта.

bobby

dllexport'ов и def тут не надо, кажется.

laki

хмм. проверял?
с плюсами манглинг происходит.

bobby

при компиляции C++-кода MSVC манглит имена (если не extern "C" при сборке C-кода - нет.

laki

а ты это с чего взял?
я просто на Си под мсвц ни разу не писал.
вопрос к автору треда в либине функция присутствует?

bobby

а ты это с чего взял?
я просто на Си под мсвц ни разу не писал.
Самое время попробовать
я только что проверял

laki

твоя правда

bobby

дело в том, что при компиляции C-кода манглинг не нужен, т.к. в C в сигнатуру функции не входят типы её параметров, а входит только имя.
так что поведение msvc вполне логично в этом случае.

Dmitriy82

Компилируется как с или как с++ - зависит от расширения (если в среде?).
Я пробовал все исходники переименовать в срр и добавить в проект.
Та же ошибка.

laki

исходники в студию. закомпилим

bobby

Да, действительно, вопрос решится намного быстрее и проще, если ты предоставишь нам исходники.
Очень жаль, если по каким-либо причинам это невозможно.

Dmitriy82

там простейшая программа - /examples/sample.c

bobby

Ты знаешь, ну просто охуительно собралось, если честно

bobby

А вот, если переименовать sample.c в sample.cpp, то уже не собирается, как я и говорил

Dmitriy82

Библиотеку необходимо использовать в с++-программе.
Можно обойтись даже без модификации заголовочных файлов:
extern "C" {
#include "glpk.h"
}
, - спасибо.
Оставить комментарий
Имя или ник:
Комментарий: