我创建了一个库来连接绘制特定的文件类型。该库需要引入第三方库以对此特定文件类型进行一些处理。第三方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,他们甚至不知道它存在。所有应该暴露的是我的自由。这可能吗?任何人都知道如何解决我的链接问题?
答案 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“可见”的头文件足以让链接器在链接应用程序时看到。我的库工作区中有几个文件夹,将头文件移动到此层次结构的顶部修复了我的问题。怪异!