好像另一个库是 C 而你的代码是 C++。您可能会遇到重载问题(C++ 编译器会破坏符号——在符号名称中添加额外的东西来区分重载等)。
如果库是纯 C,您可以尝试:
extern "C" { // disable mangling of symbol names in the block
#include "otherlib.h"
}
namespace new_lib { // new is a reserved word
int function1( int a ) {
::function1(a);
}
}
我还没有尝试过。还要考虑提供您收到的错误消息。
另一种选择是(如果库是动态的)动态加载库并调用函数。在linux中(我不知道windows)你可以使用dlopen打开库,dlsym获取符号并调用它:
// off the top of my head, not tried:
int function1( int a )
{
int (*f)(int); // define the function pointer
void * handle = dlopen( "library.so" );
f = dlsym( handle, "function1" );
f( a ); // calls function1(a) in the dynamic library
}
在这种情况下,由于您没有链接到库,因此不会出现符号冲突,但话又说回来,它仅对动态库有效,并且对于常规使用来说非常麻烦。
更新
如果您的用户不会直接使用“otherlib”(他们不会包含他们的标题)并且他们将只是 C++,那么第一种方法可能是可能的(即使阅读起来很糟糕):
// newlib.h
namespace hideout {
int f( int a );
}
using namespace hideout; // usually I would not put this on the header
// newlib.cpp
extern "C" { // if otherlib is C, else remove this line
#include "otherlib.h"
}
namespace hideout {
int f( int a ) { return ::f( a*2 ); }
}
// main.cpp
#include "newlib.h"
int main()
{
std::cout << f( 5 ) << std::endl;
}
它是如何工作的?用户代码只会看到 function1 的声明(在示例 f() 中),因为它们不包括otherlib.h。在您的编译单元中,您会看到两个声明,但您可以通过命名空间的使用来区分。标题中的 using 语句不会打扰您,因为您完全符合您的 cpp。用户main.cpp将仅包含您的标头,因此编译器只会看到hideout::f,并且由于 using 语句而将在任何地方看到它。链接器将没有问题,因为 C++ 符号被破坏以识别真正的命名空间:
// g++ 4.0 in macosx:
00002dbe T __ZN7hideout9function1Ei // namespace hideout, function1 takes int, returns int
00002db0 T _function1
如果用户代码将同时包含您的标头和otherlib.h,那么它将必须限定要调用的函数。