Ошибка неопределенного символа со встроенной функцией Solaris (SunOS 5.9)

Я определил встроенную функцию copy_string в файле cpstr.c и создал файл .so (libtest.so) для файла cpstr.c. При попытке связать этот libtest.so с test.c я получаю сообщение об ошибке

ild: (undefined symbol) char*copy_string(char*,const char*) -- referenced in the text segment of test.o

Когда я удалил встроенную функцию из функции copy_string, она работает нормально.

Ниже приведены команды, которые мы пробовали,

CC  -c  -xarch=v9  test.c

CC -G  -xarch=v9 -o libtest.so -Kpic cpstr.c

CC -xarch=v9   -g -o test  test.o  /myplace/libtest.so 

Когда мы попытались получить содержимое libtest.so, я не смог найти имя copy_string в файле libtest.so. Но я вижу это в содержании, когда я удалил «встроенный» из функции copy_string.

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

тест.с

#include <stdio.h>
extern char  *copy_string (char *, const char*);
int main()
{
    char str[50];
    copy_string(str,"hello");
    printf("%s\n", str);
    return 0;
}

cpstr.c

#include<string.h>
inline char    *copy_string (char *str1, const char *str2)
{
     return (str2 ? strcpy (str1, str2) : (char *) 0); 
}

CC  -c  -xarch=v9  test.c
CC -G  -xarch=v9 -o libtest.so -Kpic cpstr.c

CC -xarch=v9   -g -o test  test.o  /space/systpe/devendra/dhsqlroot/libtest.so 
ild: (undefined symbol) char*copy_string(char*,const char*) -- referenced in the text segment of test.o

person user2931858    schedule 25.02.2014    source источник


Ответы (2)


Он хочет, чтобы вы реализовали свою встроенную функцию в заголовочном файле.

person spiritwolfform    schedule 25.02.2014
comment
Спасибо. Я переместил эту встроенную функцию в файл заголовка (cpstr.h) и #включил этот файл заголовка в файл .c (test2.c) и создал файл .so. Но все же я получаю ту же ошибку при попытке связать этот libtest.so для test.c. Есть ли решение без прямого добавления cpstr.h в test.c. - person user2931858; 25.02.2014

Функции со встроенным спецификатором функции должны быть определены в каждом модуле, где они используются. Компилятору необходимо видеть их встроенные определения, чтобы корректно генерировать объектный код. Поэтому обычно их определение помещают в шапку.

person Vlad from Moscow    schedule 25.02.2014
comment
Спасибо. Я переместил эту встроенную функцию в файл заголовка (cpstr.h) и #включил этот файл заголовка в файл .c (test2.c) и создал файл .so. Но все же я получаю ту же ошибку при попытке связать этот libtest.so для test.c. Есть ли решение без добавления cpstr.h в test.c напрямую? - person user2931858; 25.02.2014
comment
@ user2931858 Вместо extern char copy_string (char *, const char); вы должны поместить его определение в test.c - person Vlad from Moscow; 25.02.2014
comment
Спасибо, но я заметил, что та же программа (аналогичная логика) работает на платформе Linux, так как файл .so содержит в своем содержимом имя copy_string. Есть ли какой-либо флаг, с помощью которого добавляется встроенное имя функции в файл .so при его создании в Solaris (я заметил, что если я удаляю встроенное, я вижу имя функции в содержимом файла .so, но оно исчезает, если я добавляю встроенное). Пожалуйста, дайте мне знать, доступны ли какие-либо флаги для получения имени функции в файле .so со встроенными функциями. - person user2931858; 26.02.2014