URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 4049
[ Назад ]

Исходное сообщение
"Трабл (линковщик не находит функцию new)"

Отправлено Gerald , 09-Мрт-05 20:41 
При разработке проги использую функцию new. Компилятор ошибок не выдает, но вот линковщик ее не видит, выдает ошибки. Подскажите в чем трабл, может не подключил какую то библиотеку?

Содержание

Сообщения в этом обсуждении
"Трабл (линковщик не находит функцию new)"
Отправлено Arifolth , 10-Мрт-05 10:02 
>При разработке проги использую функцию new. Компилятор ошибок не выдает, но вот
>линковщик ее не видит, выдает ошибки. Подскажите в чем трабл, может
>не подключил какую то библиотеку?

попробуй
#include <new>


"Трабл (линковщик не находит функцию new)"
Отправлено Arifolth , 10-Мрт-05 14:06 
>>При разработке проги использую функцию new. Компилятор ошибок не выдает, но вот
>>линковщик ее не видит, выдает ошибки. Подскажите в чем трабл, может
>>не подключил какую то библиотеку?
>
>попробуй
>#include <new>

эээ
и ещё
а компилятор какой?
плюсовый?


"Трабл (линковщик не находит функцию new)"
Отправлено Gerald , 10-Мрт-05 17:10 
компилятор gcc



"Трабл (линковщик не находит функцию new)"
Отправлено Xenu , 11-Мрт-05 00:54 
>При разработке проги использую функцию new. Компилятор ошибок не выдает, но вот
>линковщик ее не видит, выдает ошибки. Подскажите в чем трабл, может
>не подключил какую то библиотеку?

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


"Трабл (линковщик не находит функцию new)"
Отправлено Gerald , 12-Мрт-05 12:03 
Уважаемые коллеги... По Вашей просьбе предлагаю Вам "ругательный" кусок кода. Возникла интересная ситуация (для меня, конечно)... При использовании gcc линковщик не находит функцию new, но "видит" функции ipq, а при использовании g++ "ругается" на то, что не находит функции ipq, но НЕ "ругается" на функцию new (см. результат выполнения ниже).

#make

g++ -I/usr/local/include -L/usr/local/lib testipq.o ipn.o -o tf -lipq
testipq.o: In function `die(ipq_handle*)':
testipq.o(.text+0xf): undefined reference to `ipq_perror(char const*)'
testipq.o(.text+0x1d): undefined reference to `ipq_destroy_handle(ipq_handle*)'
testipq.o: In function `main':
testipq.o(.text+0x9f): undefined reference to `ipq_create_handle(unsigned)'
testipq.o(.text+0xd7): undefined reference to `ipq_set_mode(ipq_handle const*, unsigned char, unsigned)'
testipq.o(.text+0x10e): undefined reference to `ipq_read(ipq_handle const*, unsigned char*, unsigned, int)'
testipq.o(.text+0x13a): undefined reference to `ipq_message_type(unsigned char const*)'
testipq.o(.text+0x16c): undefined reference to `ipq_get_msgerr(unsigned char const*)'
testipq.o(.text+0x191): undefined reference to `ipq_get_packet(unsigned char const*)'
testipq.o(.text+0x1cf): undefined reference to `ipq_set_verdict(ipq_handle const*, unsigned, unsigned, unsigned, unsigned char*)'
collect2: ld returned 1 exit status
make: *** [res] Ошибка


"Трабл (линковщик не находит функцию new)"
Отправлено gyn61 , 12-Мрт-05 12:31 
Попробуйте
extern "C" {
#include <libipq.h>
}

"Трабл (линковщик не находит функцию new)"
Отправлено Xenu , 13-Мрт-05 21:31 
gcc это не просто компилятор, это GNU Compiler Collection и его задача состоит в том, что бы определить тип файла, который был подан на обработку и вызвать соответствующий компилятор. Это может быть C, C++, Fortran и так далее, подробности на http://gcc.gnu.org/

подробности как gcc определяет тип файла мне не известны, знаю, что один из критериев, расширение в имени файла (c, cpp, cc, C, cxx)

gcc вызывает с-компилятор если имя файла оканчивается на .c, а тот не знает про new потому, что new это оператор языка С++.
g++ вызывает с++ компилятор безусловно и тот находит new, но формирует c++ имена для всех функций, которые линковщик не может найти в libipq так как та собрана как c-библиотека.

поэтому используйте extern "C", как уже было рекомендовано, если компилируете С++ и С вместе и вызываете g++ и добавьте -lstdc++ если вызываете gcc.


"Трабл (линковщик не находит функцию new)"
Отправлено Gerald , 14-Мрт-05 19:56 
Уважаемый Xenu!!! Огромное спасибо за подсказку, какую библиотеку подключать (я к этому времени уже начал догадываться в чем дело)...
Я решил этот вопрос следующим образом. Взял исходник библиотеки libipq (там один файл libipq.c) изменил его название на libipq.cрр (тем самым компилирую в с++ формате) откомпилил вместе с проектом. Все прошло замечательно.... За помощь еще раз всем спасибо...



"Трабл (линковщик не находит функцию new)"
Отправлено Xenu , 15-Мрт-05 03:12 
>Уважаемый Xenu!!! Огромное спасибо за подсказку, какую библиотеку подключать (я к этому
>времени уже начал догадываться в чем дело)...
Пожалуйста. Всегда приятно ответить на правильно заданый вопрос. :-)
http://www.opennet.me/opennews/art.shtml?num=1692


>Я решил этот вопрос следующим образом. Взял исходник библиотеки libipq (там один
>файл libipq.c) изменил его название на libipq.cрр (тем самым компилирую в
>с++ формате) откомпилил вместе с проектом. Все прошло замечательно.... За помощь
>еще раз всем спасибо...
Тут мы видим мощь невообразимую и гибкость необычайную открытых исходников в действии.
Взял, подправил под свои нужды и все работает.