将图书馆内的图书馆与外部人员联系起来?

时间:2010-11-29 20:36:28

标签: c eclipse linker extern

我创建了一个库来连接绘制特定的文件类型。该库需要引入第三方库以对此特定文件类型进行一些处理。第三方lib要求其用户创建一些外部函数,用于在目标硬件上创建数据类型。

所以,它看起来像这样:

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

我的应用程序调用我的Lib并说“画我文件X”,My Lib做了一堆垃圾,最终调用了第三方Lib并说“进程文件X”。第三方Lib要求声明它使用的几个外部。

我在My Lib中制造了所有这些外围人员。我的问题是,当我链接我的应用程序时,它告诉我未定义的所有外部函数的引用。我无法弄清楚为什么。下面是My 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在第三方Lib中。

我的My Lib和第三方Lib都包含在我的应用程序中。理想情况下,我不希望将My Lib的用户暴露给第三方Lib,因此例如My App根本不需要包含第三方Lib,他们甚至不知道它存在。所有应该暴露的是我的自由。这可能吗?任何人都知道如何解决我的链接问题?

2 个答案:

答案 0 :(得分:0)

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;
    }

答案 1 :(得分:0)

似乎我的问题是我没有包含我的externs“可见”的头文件足以让链接器在链接应用程序时看到。我的库工作区中有几个文件夹,将头文件移动到此层次结构的顶部修复了我的问题。怪异!