LINUX.ORG.RU

История изменений

Исправление bugfixer, (текущая версия) :

Но при сборке конечной либы - линкер же должен быть увидеть что никто не содержит инстанциации Stream.

Потуглите «gcc no-undefined», выпадает в частности это и вот это. Думаю это именно то что Вы ищете.

Возможно примерчик ниже Вам немного прояснит что происходит:

$ cat mylib.cpp 
#include <iostream>

template<class T> struct Foo {
   static void Bar(T val);
};

#ifndef HIDEME
template<class T>
void Foo<T>::Bar(T val) {
   using namespace std;
   cout << "val: " << val << endl;
}
#endif

void mylibFunc()
{
   Foo<int>::Bar(1);
}

$ g++ -fPIC -shared -g -o mylib.so mylib.cpp 
$ nm -o mylib.so | c++filt | fgrep Foo
mylib.so:00000000000011c4 W Foo<int>::Bar(int)

$ g++ -fPIC -shared -g -o mylib.so -DHIDEME mylib.cpp 
$ nm -o mylib.so | c++filt | fgrep Foo
mylib.so:                 U Foo<int>::Bar(int)

$ g++ -fPIC -shared -g -o mylib.so -DHIDEME -Wl,--no-undefined mylib.cpp 
/usr/bin/ld: /tmp/ccWBgitV.o: in function `mylibFunc()':
mylib.cpp:17: undefined reference to `Foo<int>::Bar(int)'
collect2: error: ld returned 1 exit status

$ g++ -fPIC -shared -g -o mylib.so -Wl,--no-undefined mylib.cpp 
$ nm -o mylib.so | c++filt | fgrep Foo
mylib.so:00000000000011c4 W Foo<int>::Bar(int)

Исправление bugfixer, :

Но при сборке конечной либы - линкер же должен быть увидеть что никто не содержит инстанциации Stream.

Потуглите «gcc no-undefined», выпадает в частности это и вот это. Возможно это именно то что Вы ищете.

Может быть примерчик ниже Вам немного прояснит что происходит:

$ cat mylib.cpp 
#include <iostream>

template<class T> struct Foo {
   static void Bar(T val);
};

#ifndef HIDEME
template<class T>
void Foo<T>::Bar(T val) {
   using namespace std;
   cout << "val: " << val << endl;
}
#endif

void mylibFunc()
{
   Foo<int>::Bar(1);
}

$ g++ -fPIC -shared -g -o mylib.so mylib.cpp 
$ nm -o mylib.so | c++filt | fgrep Foo
mylib.so:00000000000011c4 W Foo<int>::Bar(int)

$ g++ -fPIC -shared -g -o mylib.so -DHIDEME mylib.cpp 
$ nm -o mylib.so | c++filt | fgrep Foo
mylib.so:                 U Foo<int>::Bar(int)

$ g++ -fPIC -shared -g -o mylib.so -DHIDEME -Wl,--no-undefined mylib.cpp 
/usr/bin/ld: /tmp/ccWBgitV.o: in function `mylibFunc()':
mylib.cpp:17: undefined reference to `Foo<int>::Bar(int)'
collect2: error: ld returned 1 exit status

$ g++ -fPIC -shared -g -o mylib.so -Wl,--no-undefined mylib.cpp 
$ nm -o mylib.so | c++filt | fgrep Foo
mylib.so:00000000000011c4 W Foo<int>::Bar(int)

Исправление bugfixer, :

Но при сборке конечной либы - линкер же должен быть увидеть что никто не содержит инстанциации Stream.

Потуглите «gcc no-undefined», выпадает в частности это и вот это. Возможно это именно то что Вы ищете.

Может быть примерчик ниже Вам немного прояснит что происходит:

$ cat mylib.cpp 
#include <iostream>

template<class T> struct Foo {
   static void Bar(T val);
};

#ifndef HIDEME
template<class T>
void Foo<T>::Bar(T val) {
   using namespace std;
   cout << "val: " << val << endl;
}
#endif

void mylibFunc()
{
   Foo<int>::Bar(1);
}

$ g++ -fPIC -shared -g -o mylib.so mylib.cpp 
$ nm -o mylib.so | c++filt | fgrep Foo
mylib.so:00000000000011c4 W Foo<int>::Bar(int)

$ g++ -fPIC -shared -g -o mylib.so -DHIDEME mylib.cpp 
$ nm -o mylib.so | c++filt | fgrep Foo
mylib.so:                 U Foo<int>::Bar(int)

$ g++ -fPIC -shared -g -o mylib.so -DHIDEME -Wl,--no-undefined mylib.cpp 
/usr/bin/ld: /tmp/ccWBgitV.o: in function `mylibFunc()':
mylib.cpp:17: undefined reference to `Foo<int>::Bar(int)'
collect2: error: ld returned 1 exit status

Исправление bugfixer, :

Но при сборке конечной либы - линкер же должен быть увидеть что никто не содержит инстанциации Stream.

Потуглите «gcc no-undefined», выпадает в частности это и вот это. Возможно это именно то что Вы ищете.

Может быть вот это Вам немного прояснит что происходит:

$ cat mylib.cpp 
#include <iostream>

template<class T> struct Foo {
   static void Bar(T val);
};

#ifndef HIDEME
template<class T>
void Foo<T>::Bar(T val) {
   using namespace std;
   cout << "val: " << val << endl;
}
#endif

void mylibFunc()
{
   Foo<int>::Bar(1);
}

$ g++ -fPIC -shared -g -o mylib.so mylib.cpp 
$ nm -o mylib.so | c++filt | fgrep Foo
mylib.so:00000000000011c4 W Foo<int>::Bar(int)

$ g++ -fPIC -shared -g -o mylib.so -DHIDEME mylib.cpp 
$ nm -o mylib.so | c++filt | fgrep Foo
mylib.so:                 U Foo<int>::Bar(int)

$ g++ -fPIC -shared -g -o mylib.so -DHIDEME -Wl,--no-undefined mylib.cpp 
/usr/bin/ld: /tmp/ccWBgitV.o: in function `mylibFunc()':
mylib.cpp:17: undefined reference to `Foo<int>::Bar(int)'
collect2: error: ld returned 1 exit status

Исходная версия bugfixer, :

Но при сборке конечной либы - линкер же должен быть увидеть что никто не содержит инстанциации Stream.

Потуглите «gcc no-undefined», выпадает в частности это и вот это. Возможно это то что Вы ищете.

Может быть вот это Вам немного прояснит что происходит:

$ cat mylib.cpp 
#include <iostream>

template<class T> struct Foo {
   static void Bar(T val);
};

#ifndef HIDEME
template<class T>
void Foo<T>::Bar(T val) {
   using namespace std;
   cout << "val: " << val << endl;
}
#endif

void mylibFunc()
{
   Foo<int>::Bar(1);
}

$ g++ -fPIC -shared -g -o mylib.so mylib.cpp 
$ nm -o mylib.so | c++filt | fgrep Foo
mylib.so:00000000000011c4 W Foo<int>::Bar(int)

$ g++ -fPIC -shared -g -o mylib.so -DHIDEME mylib.cpp 
$ nm -o mylib.so | c++filt | fgrep Foo
mylib.so:                 U Foo<int>::Bar(int)

$ g++ -fPIC -shared -g -o mylib.so -DHIDEME -Wl,--no-undefined mylib.cpp 
/usr/bin/ld: /tmp/ccWBgitV.o: in function `mylibFunc()':
mylib.cpp:17: undefined reference to `Foo<int>::Bar(int)'
collect2: error: ld returned 1 exit status