C 将库中的库与外部链接?

C 将库中的库与外部链接?,c,eclipse,linker,extern,C,Eclipse,Linker,Extern,我正在创建一个库,以便与特定文件类型的图形交互。此库需要拉入第三方库来对此特定文件类型执行某些处理。这个第三方库要求它的用户创建一些外部函数,用于在目标硬件上生成数据类型 所以,看起来是这样的: ---------------- | | | 3rd Party | | Lib | | | ---------------- | | \/ --------------- |

我正在创建一个库,以便与特定文件类型的图形交互。此库需要拉入第三方库来对此特定文件类型执行某些处理。这个第三方库要求它的用户创建一些外部函数,用于在目标硬件上生成数据类型

所以,看起来是这样的:

----------------
|              | 
| 3rd Party    | 
|   Lib        | 
|              | 
----------------
      |
      |
     \/
---------------
|             | 
|  My Lib     | 
---------------
|  externs    | 
---------------
      |
      |
     \/
---------------
|             | 
|  My App     | 
|             | 
|             | 
---------------
我的应用程序调用我的库并说“绘制我的文件X”,我的库做了一堆垃圾,最终调用第三方库并说“处理文件X”。第三方库需要声明几个它使用的外部程序

我在我的库中创建了所有这些外部对象。我的问题是,当我链接我的应用程序时,它告诉我所有外部函数的未定义引用。我不明白为什么。下面是我的库中第三方库调用的一个外部库:

// 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;
}
//内部类型转换.c
extern int CreateShort(短*短列表,整数短)
{
int i;
对于(i=0;i
当我链接我的应用程序时,我会发现(在其他几个类似错误中):

open.cpp:对“CreateShort”的未定义引用

其中open.cpp位于第三方库中

我的应用程序中包含了我的库和第三方库。理想情况下,我不想让我的Lib用户暴露给第三方Lib,例如,我的应用程序根本不需要包含第三方Lib,他们甚至不知道它的存在。应该公开的是我的自由。这可能吗?有人知道如何解决我的链接问题吗?

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; } //这将放在头文件中 extern int CreateShort(短*短列表,整数短) //这将放在一个.c文件中。 int CreateShort(short*shortList,int numShorts) { ... 返回错误\u OK; }

3)如果你使用C++编写第三方LIB调用的函数,而第三方LIB希望事情像C一样工作,则必须使用Extn“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; } //这将放在头文件中 外部“C”int CreateShort(短*短列表,int numShorts) //也可以将其包装在块中: //外部“C”{ //int-someFunc1(int-x); //int-someFunc2(int-y); // } //这将放在一个.cpp文件中。 外部“C”int CreateShort(短*短列表,int numShorts) { ... 返回错误\u OK; }


似乎我的问题是,我没有足够的头文件包含我的外部“可见”链接器看到链接应用程序时。我的库工作区中有几个文件夹,将头文件移动到该继承人权限的顶部修复了我的问题。奇怪

这是纯C,我已经尝试了extern“C”,并在函数头中声明了extern。但这两个都不能解决问题,谢谢你。我正在使用Eclipse3.3.0。我有一个应用程序直接使用“第三方库”,在应用程序本身中创建外部程序,链接和运行良好。我需要将此功能放在另一个库中,就像我正在尝试创建的一样,但它没有链接。@gooner15 OK。查看编译器文档以了解调用约定。据我所知,Eclipse既不是编译器,也不是链接器。:)除非它已落入Emacs区域。如果您在Linux上,请尝试man gcc或info gcc并搜索调用约定。然后看看第三方库的标题,看看他们期望什么样的调用约定。好吧,我想我不确定我应该寻找什么,因为调用约定似乎只处理跨语言调用?我在Eclipse中使用Cygwin,它是带有lynxos交叉编译器的gcc工具链。很抱歉,我以前从未遇到过这样的链接问题,我真的不知道该去哪里查找。@gooner15必须有一些标准来定义事物的命名方式、传递给函数的参数、返回时谁弹出堆栈等等。这些东西是由调用约定定义的。查看第三方库标题中的函数原型,查看是否有任何属性语句,并将它们发布在此处。我不确定lynxos的默认调用约定是什么,所以如果你能弄清楚这一点,它将有助于缩小问题的范围。