我创建一个库接口到绘图一个特定的文件类型。此库需要拉入第三方库来处理此特定文件类型。此第三方库要求其用户创建一些外部函数,用于在目标硬件上生成数据类型。
看起来是这样的:
----------------
| |
| 3rd Party |
| Lib |
| |
----------------
|
|
\/
---------------
| |
| My Lib |
---------------
| externs |
---------------
|
|
\/
---------------
| |
| My App |
| |
| |
---------------
我的应用程序调用我的Lib并说“draw me file X”,我的Lib做了一堆垃圾最终调用第三方Lib并说“process file X”。第三方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和第三方Lib。理想情况下,我不想将我的LIB用户暴露给第三方LIB,所以例如,我的应用程序根本不需要包括第三方LIB,他们甚至不知道它存在。所有应该暴露的是我的自由。这可能吗?有人知道如何解决我的链接问题吗?
最佳答案
1)在编译器和链接器文档中查找“调用约定”。你很可能错配了。
2)在C中,(不是C++)应该在头文件中使用外部关键字,而不是在函数定义中使用。确保在所有使用声明的文件中都包含头,包括实现头声明的.C文件。
//这个放在头文件中
extern int CreateShort(短*短列表,int numShorts)
//这是一个.c文件。
int CreateShort(短*短列表,int numShorts)
{
...
返回错误;
}
3)如果您使用C++编写第三方LIB调用的函数,而第三方LIB希望事情像C一样工作,则必须使用Extn“C”来防止名称篡改。
//这个放在头文件中
外部“C”int CreateShort(short*短列表,int numShorts)
//也可以将其包装在块中:
//外部“C”{
//int someFunc1(int x);
//int someFunc2(int y);
// }
//此文件位于.cpp文件中。
外部“C”int CreateShort(short*短列表,int numShorts)
{
...
返回错误;
}