2

だから、これが問題です。LinuxでMayaのプラグインを開発するには、GCC4.1.2でコンパイルする必要があります。ただし、このコンパイラは新しいC++0x機能をサポートしていません。

このようなことをすることは可能でしょうか:

gcc-4.6 -o test.cpp.o -c test.cpp
gcc-4.1.2 -o exec_test test.cpp.o

私はそれが可能であるかどうか深刻な疑いを持っていますが、尋ねる価値があります。

これが不可能な場合、同様のことを達成する方法はありますか?

4

1 に答える 1

3

これら 2 つの GCC バージョンの ABI は互換性があります。問題は、GCC 4.6 によってコンパイルされたオブジェクトが、新しい GCC の C++ 標準ライブラリによってのみ定義されているシンボルに依存する可能性があることです (たとえば、オブジェクトをstd::fstream取得するコンストラクターを使用する場合、依存関係があります)。std::stringこれは、C++11 をサポートする GCC の最近のバージョンにのみ存在します。)

libstdc++.so.6.0.16GCC 4.6(つまり)からlibstdc ++にリンクしている限り、つまり次のようにリンクしている限り機能します-L /path/to/gcc-4.6/lib

また、 libstdc++ マニュアルにリストされている方法の 1 つを使用して、動的ローダーにそのライブラリを使用するように指示することにより、ライブラリの新しいバージョンが実行時に確実に見つかるようにする必要があります。

例えば:

$ cat x.cc
#include <vector>
#include <fstream>
#include <string>
int main()
{
    std::string s = "output";
    std::ofstream f(s);
    std::vector<int> v(3);
    int n;
    for (auto i : v)
        ++n;
    f << n << '\n';
}
$ g++-4.6 -std=c++0x x.cc -c
$ g++-4.1 x.o
x.o: In function `main':
x.cc:(.text+0x5c): undefined reference to `std::basic_ofstream<char, std::char_traits<char> >::basic_ofstream(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::_Ios_Openmode)'
collect2: ld returned 1 exit status
$ g++-4.1 x.o -L /path/to/4.6/lib64 -Wl,-rpath,/path/to/4.6/lib64
$ ./a.out
$ cat output
3
于 2012-07-18T16:06:27.463 に答える