Как собрать библиотеку?
От: DOlya  
Дата: 18.11.02 09:41
Оценка:
На сайте www.sf.net нашла очень полезную для себя библиотеку для создания postscript файлов.
Проблема в том, что мне ее не подключить в обычное консольное приложение.
Ругается вот так:
planpscontest.obj : error LNK2001: unresolved external symbol "void __cdecl ps_endplot(char *,char)" (?ps_endplot@@YAXPADD@Z)
planpscontest.obj : error LNK2001: unresolved external symbol "void __cdecl ps_ellipse(float,float)" (?ps_ellipse@@YAXMM@Z)
planpscontest.obj : error LNK2001: unresolved external symbol "void __cdecl ps_ellip_disk(float,float,float)" (?ps_ellip_disk@@YAXMMM@Z)
planpscontest.obj : error LNK2001: unresolved external symbol "void __cdecl ps_movea(float,float)" (?ps_movea@@YAXMM@Z)
planpscontest.obj : error LNK2001: unresolved external symbol "void __cdecl ps_circle(float)" (?ps_circle@@YAXM@Z)
planpscontest.obj : error LNK2001: unresolved external symbol "void __cdecl ps_disk(float,float)" (?ps_disk@@YAXMM@Z)
planpscontest.obj : error LNK2001: unresolved external symbol "void __cdecl ps_home(void)" (?ps_home@@YAXXZ)
planpscontest.obj : error LNK2001: unresolved external symbol "void __cdecl ps_origin(float,float,float,float)" (?ps_origin@@YAXMMMM@Z)
planpscontest.obj : error LNK2001: unresolved external symbol "void __cdecl ps_cms(void)" (?ps_cms@@YAXXZ)
planpscontest.obj : error LNK2001: unresolved external symbol "void __cdecl ps_iniplot(char *,float)" (?ps_iniplot@@YAXPADM@Z)
Debug/planpscontest.exe : fatal error LNK1120: 10 unresolved externals
Error executing link.exe.

Причем этот же проект на другой машине работает без проблем, а у меня вот так ругается.
Чего ему не хватает?
Re: Как собрать библиотеку?
От: Аноним  
Дата: 18.11.02 09:46
Оценка:
Наверное, надо указать эту библиотеку компоновщику.
Re: Как собрать библиотеку?
От: esp  
Дата: 18.11.02 09:53
Оценка:
Ты линкуешь статически, значит нужны *.lib файлы это библиотеки,
если на др. машине все нормально, значит у нее пути для нохождения *.lib совпали, где у тебя твои *.lib лежат.

на чем собираешь?

Если VC++, то в свойствах проекта на вкладке Link пропиши свои *.lib,
если ошибка повторится, посмотри пути в Tools->Options на вкладке Directories
Re[2]: Как собрать библиотеку?
От: DOlya  
Дата: 18.11.02 10:05
Оценка:
Здравствуйте, esp, Вы писали:

esp>Ты линкуешь статически, значит нужны *.lib файлы это библиотеки,

esp>если на др. машине все нормально, значит у нее пути для нохождения *.lib совпали, где у тебя твои *.lib лежат.

esp>на чем собираешь?


esp>Если VC++, то в свойствах проекта на вкладке Link пропиши свои *.lib,

esp>если ошибка повторится, посмотри пути в Tools->Options на вкладке Directories

Собираю на VC++.
Только там нет *.lib Там только *.с и *.h. Есть *.mak, но через него тоже не получается.
Re[3]: Как собрать библиотеку?
От: Аноним  
Дата: 18.11.02 10:19
Оценка:
Точно не помню, но все тривиально и инструкций еспа должно вполне хватить.
Re[3]: Как собрать библиотеку?
От: esp  
Дата: 18.11.02 10:20
Оценка:
значит самому *.lib надо сделать,

у VC есть утилита lib.exe

пишешь

lib /DEF:my.def

пример DEF файла для VC:


LIBRARY MY.DLL

EXPORTS
My@4


@4 — это означает что ф-я имеет один параметр, т.е. по 4 байта на параметр,

соответственно если у тебя 4 параметра(это смотри в *.h), то

My@16


получишь *.lib включи его в проект, как писал выше,

если не хочешь мучатся с *.DEF, линкуй Runtime

через LoadLibrary И GetProcAddress


Удачи
Re[4]: Как собрать библиотеку?
От: esp  
Дата: 18.11.02 10:23
Оценка:
А еще забыл,

вызывай lib из директории где у тебя DLL лежит, т.е.

*.def и *.dll должны в одной директории лежать
Re[5]: Как собрать библиотеку?
От: DOlya  
Дата: 18.11.02 10:30
Оценка:
Здравствуйте, esp, Вы писали:

esp>А еще забыл,


esp>вызывай lib из директории где у тебя DLL лежит, т.е.


esp>*.def и *.dll должны в одной директории лежать


Чего-то я не понимаю...
Ну нет у меня ни def ни *.dll!
Вот что есть:


Что мне с этим делать-то?
Re[4]: Как собрать библиотеку?
От: DOlya  
Дата: 18.11.02 10:31
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Точно не помню, но все тривиально и инструкций еспа должно вполне хватить.


К сожалению не получается.
Re: Как собрать библиотеку?
От: orangy Россия
Дата: 18.11.02 10:40
Оценка: 9 (2)
Здравствуйте DOlya, Вы писали:

DO>На сайте www.sf.net нашла очень полезную для себя библиотеку для создания postscript файлов.

Как называется?

DO>Проблема в том, что мне ее не подключить в обычное консольное приложение.

Есть несколько способов. Насколько я понимаю, имеем следующую структуру:
1. Есть библиотека в исходниках
2. К ней идёт файл сборки (makefile, тот самый *.mak)
3. У тебя есть собственный проект (консольное приложение), в котором ты хочешь использовать эту библиотеку.

Самое простое — сделать так:
1. Создай проект новый проект Win32 Static Library
2. Добавь туда все файлы *.c и *.h из сторонней библиотеки
3. Собери в Debug & Release — получишь lib-файлы для того и другого
4. Открывай свой проект.
5. Измени настройки проекта следующим образом:
В include path добавь путь к .h файлам библиотеки
В library path добавь путь к .lib файлам соответственно в Debug и Release
В список библиотек добавь имя оной библиотеки
6. Собери свой проект
7. Радуйся если работает

Можно воспользоваться makefile для сборки библиотеки. Если у тебя среда разработки настроена правильно — достаточно набрать в коммандной строке в каталоге с библиотекой
NMAKE /f plot_ps.mak

Если не получается — говори, какой у тебя компилятор (VC6?), как разложены проекты по каталогам и т.п. чтобы можно было выдать более конкретные инструкции
Удачи.
RSDN@Home 1.0 alpha 12 (tester's build)
"Develop with pleasure!"
Re: От модератора
От: Хитрик Денис Россия RSDN
Дата: 18.11.02 10:41
Оценка:
Перенесено в Средства Разработки из С++
Правила нашего с вами форума.
Как правильно задавать вопросы. © 2001 by Eric S. Raymond; перевод: © 2002 Валерий Кравчук.
Re[6]: Как собрать библиотеку?
От: esp  
Дата: 18.11.02 10:52
Оценка:
так я ж пишу тебе, сделай его сам,
и написал как сделать
Re[2]: Как собрать библиотеку?
От: DOlya  
Дата: 18.11.02 11:39
Оценка:
Здравствуйте, orangy, Вы писали:

Спасибо за ответ

DO>>На сайте www.sf.net нашла очень полезную для себя библиотеку для создания postscript файлов.

O>Как называется?
Называется plot_psxps.

Вот что интересно: # Tricky part: make a DLL. I don't know how to it for
# MSDOS/Windows, so you're on your own here
Это комментарии автора


O>Самое простое — сделать так:

O>1. Создай проект новый проект Win32 Static Library
O>2. Добавь туда все файлы *.c и *.h из сторонней библиотеки
O>3. Собери в Debug & Release — получишь lib-файлы для того и другого
Осталасть такая вот ошибка:
fatal error C1083: Cannot open include file: 'sys/utsname.h'


Кажется,это что-то из юникса? Убрать не помогает, т.к. объявляется структура, на которой там все завязано...
Re[3]: Как собрать библиотеку?
От: orangy Россия
Дата: 18.11.02 12:01
Оценка:
Здравствуйте DOlya, Вы писали:

DO>Вот что интересно: # Tricky part: make a DLL. I don't know how to it for

DO> # MSDOS/Windows, so you're on your own here
DO>Это комментарии автора

Ну что же, кто предупреждён — тот вооружен. Бейся
Меня немного смущает "# Tricky part: make a DLL." — тебе нужна DLL или обойдёшься статической сборкой?

DO>Осталасть такая вот ошибка:

DO>
DO>fatal error C1083: Cannot open include file: 'sys/utsname.h'
DO>


Далее у тебя начинается процесс, называемый "портирование", т.е. перенос библиотеки с одной платформы на другую
Обычно, не самое простое занятие, так что придётся повозиться. Либо ты найдёшь в сети уже готовый порт. Гугль не помогает?

DO>Кажется,это что-то из юникса? Убрать не помогает, т.к. объявляется структура, на которой там все завязано...


Хинт: Старайся предоставлять информацию, которая поможет населению тебе помочь без лишних усилий. На текущий момент, чтобы разобраться в проблеме, кому-то нужно будет скачать эту библиотеку и разобраться, что же это такое. А это время. Чужое. Бесплатное Так что в данном случае, стоило привести название структуры и пример использования из библиотеки. Наверняка, кроме структуры есть еще и функции какие-то... Если же просто структура — найди в сети этот заголовочный файл и используй его локально.
RSDN@Home 1.0 alpha 12 (tester's build)
"Develop with pleasure!"
Re[4]: Как собрать библиотеку?
От: DOlya  
Дата: 18.11.02 13:25
Оценка:
Все сделала, как Вы написали. Создала 2 библиотеки, все прописала. И все равно:

main.obj : error LNK2001: unresolved external symbol "void __cdecl ps_endplot(char *,char)" (?ps_endplot@@YAXPADD@Z)
main.obj : error LNK2001: unresolved external symbol "void __cdecl ps_3Dbar(float,float,float,float,float,float,int)" (?ps_3Dbar@@YAXMMMMMMH@Z)
main.obj : error LNK2001: unresolved external symbol "void __cdecl ps_3Dsetup(float,float,float,float,float,float,float,float,float,float,float,float,float)" (?ps_3Dsetup@@YAXMMMMMMMMMMMMM@Z)
main.obj : error LNK2001: unresolved external symbol "void __cdecl ps_origin(float,float,float,float)" (?ps_origin@@YAXMMMM@Z)
main.obj : error LNK2001: unresolved external symbol "void __cdecl ps_cms(void)" (?ps_cms@@YAXXZ)
main.obj : error LNK2001: unresolved external symbol "void __cdecl ps_iniplot(char *,float)" (?ps_iniplot@@YAXPADM@Z)


Re[5]: Как собрать библиотеку?
От: Sashko Россия http://www.dc.baika.ru/
Дата: 19.11.02 11:44
Оценка: 3 (1)
Здравствуйте, DOlya, Вы писали:

DO>Все сделала, как Вы написали. Создала 2 библиотеки, все прописала. И все равно:


DO>
DO>main.obj : error LNK2001: unresolved external symbol "void __cdecl ps_endplot(char *,char)" (?ps_endplot@@YAXPADD@Z)
DO>main.obj : error LNK2001: unresolved external symbol "void __cdecl ps_3Dbar(float,float,float,float,float,float,int)" (?ps_3Dbar@@YAXMMMMMMH@Z)
DO>main.obj : error LNK2001: unresolved external symbol "void __cdecl ps_3Dsetup(float,float,float,float,float,float,float,float,float,float,float,float,float)" (?ps_3Dsetup@@YAXMMMMMMMMMMMMM@Z)
DO>main.obj : error LNK2001: unresolved external symbol "void __cdecl ps_origin(float,float,float,float)" (?ps_origin@@YAXMMMM@Z)
DO>main.obj : error LNK2001: unresolved external symbol "void __cdecl ps_cms(void)" (?ps_cms@@YAXXZ)
DO>main.obj : error LNK2001: unresolved external symbol "void __cdecl ps_iniplot(char *,float)" (?ps_iniplot@@YAXPADM@Z)
DO>


Проблема видимо следующая. Ты делаешь #include <plot_ps.h> в CPP файле, и файл компилируется как CPP файл. Поэтому все декларации в plot_ps.h рассматриваются как декларации C++. Отсюда декарарованные имена

?ps_endplot@@YAXPADD@Z == void __cdecl ps_endplot(char *,char)


Сама же plot_ps библиотека состоит из .C файлов, и скорей всего, у тебя настроено так, что эти файлы компилируются в C моде (и это правильно, потому что иначе, вполне возможно, при компиляции появятся ошибки). По этому, в .LIB файле есть

_ps_endplot


но нет

?ps_endplot@@YAXPADD@Z


Выходы. Либо писать все на С. Либо нужно делать #include <plot_ps.h> как-то вот так

#ifdef __cplusplus
extern "C" {
#endif

#include <plot_ps.h>

#ifdef __cplusplus
}
#endif


Да, можно подправить и саму plot_ps.h, добавив теже #ifdef __cplusplus.

Качнул, plot_psxps-6.4.1, собралась без проблем. В plot_ps.h настроил

#define    UNIX    0
#define    VMS    0
#define    MS_DOS    1


и закомментировал #include <sys/time.h>.
Re[6]: Как собрать библиотеку?
От: Sashko Россия http://www.dc.baika.ru/
Дата: 19.11.02 11:56
Оценка:
Здравствуйте, Sashko, Вы писали:

S>Качнул, plot_psxps-6.4.1, собралась без проблем.


Вот что получилось с примера cube

http://www.ozero.net/~shk/src/cubes.ps

Нет PS Viewer'a, так что, по F3, вижу только цифры.
Re[7]: Как собрать библиотеку?
От: DOlya  
Дата: 19.11.02 12:06
Оценка:
Здравствуйте, Sashko, Вы писали:

S>>Качнул, plot_psxps-6.4.1, собралась без проблем.


S>Вот что получилось с примера cube


S>http://www.ozero.net/~shk/src/cubes.ps


S>Нет PS Viewer'a, так что, по F3, вижу только цифры.


Большое спасибо Все работает!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.