История изменений
Исправление 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