Связать библиотеку внутри библиотеки с экстерьерами? - PullRequest
1 голос
/ 29 ноября 2010

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

Итак, это выглядит так:

----------------
|              | 
| 3rd Party    | 
|   Lib        | 
|              | 
----------------
      |
      |
     \/
---------------
|             | 
|  My Lib     | 
---------------
|  externs    | 
---------------
      |
      |
     \/
---------------
|             | 
|  My App     | 
|             | 
|             | 
---------------

Мои вызовы приложенияМой Lib и говорит "нарисуй мне файл X", My Lib делает кучу мусора, в конце концов вызывает Сторонний Lib и говорит "файл процесса X".Сторонняя библиотека требует, чтобы было объявлено, что она использует несколько внешних объектов.

Я сделал все эти внешние элементы внутри My Lib.Моя проблема в том, что когда я связываю Мое приложение, оно говорит мне неопределенные ссылки на все внешние функции.Я не могу понять, почему.Вот один из внешних компонентов в My Lib, который будет вызывать сторонний Lib:

// inside typeConversions.c

extern int CreateShort(short* shortList, int numShorts)
{
    int i;

    for(i = 0; i < numShorts; i++)
    {
        BYTE_SWAP_SHORT(shortList[i]);
    }

    return ERROR_OK;
}

Когда я связываю Мое приложение, я получаю (среди нескольких других подобных ошибок):

open.cpp:неопределенная ссылка на `CreateShort '

Где open.cpp находится внутри сторонней библиотеки.

У меня есть и моя библиотека, и сторонняя библиотека, включенная в мое приложение.В идеале я не хочу показывать пользователям My Lib стороннюю версию Lib, поэтому, например, My App вообще не нужно будет включать стороннюю версию Lib, они не знают, что она вообще существует.Все, что должно быть разоблачено, это Мой Lib.Это возможно?Кто-нибудь знает, как исправить мою проблему со ссылками?

Ответы [ 2 ]

0 голосов
/ 01 декабря 2010

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

0 голосов
/ 29 ноября 2010

1) Найдите «соглашения о вызовах» в документации компилятора и компоновщика.Скорее всего, у вас несоответствие.

2) В C (не в C ++) ключевое слово extern следует использовать в заголовке, а не в определении функции.Убедитесь, что вы включили заголовок во все файлы, которые используют объявления, включая файл .C, который реализует то, что объявляет заголовок.

    // This goes in a header file
    extern int CreateShort(short* shortList, int numShorts)

    // This goes in a .c file.
    int CreateShort(short* shortList, int numShorts)
    {
        ...
        return ERROR_OK;
    }

3) Если вы используете C ++ для написания функций, которые третьи лицаlib вызывает, и сторонний lib ожидает, что все будет работать как C, вам придется использовать extern "C" для предотвращения искажения имени.

    // This goes in a header file
    extern "C" int CreateShort(short* shortList, int numShorts)
    // You can also wrap it in a block:
    // extern "C" {
    // int someFunc1( int x );
    // int someFunc2( int y );
    // }

    // This goes in a .cpp file.
    extern "C" int CreateShort(short* shortList, int numShorts)
    {
        ...
        return ERROR_OK;
    }
...