他のlibが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;
}
それはどのように機能しますか?ユーザーコードには、 otherlib.hが含まれていないため、function1の宣言(例ではf())のみが表示されます。コンパイルユニット内には2つの宣言がありますが、名前空間を使用することで区別されます。ヘッダーの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の両方が含まれる場合は、呼び出す関数を修飾する必要があります。