Принудительное определение символа для экземпляра шаблона C ++ в библиотеке
Я хотел бы предоставить библиотеку, которая предоставляет шаблон кода. Но я также хотел бы сохранить максимально возможную принадлежность этого кода (сгенерированного кода), когда я могу предположить использование различных обычных типов моего шаблона. Вот пример того, что я пытаюсь сделать:
lib1.h
#include <iostream>
template<int N>
void print_me() {
std::cout << "I am function number " << N << std::endl;
}
lib1.cpp
#include "lib1.h"
/* Force symbols to be defined here. */
template void print_me<0>();
template void print_me<1>();
Я компилирую свою библиотеку, используя:
g ++ -shared -fPIC lib1.cpp -o lib1.so
И когда я использую свою библиотеку:
main.cpp
#include <lib1.h>
int main() {
print_me<0>();
print_me<1>();
print_me<2>();
}
Составлено с:
g ++ main.cpp -l1
Здесь я ожидал бы, что символы print_me <0> () и print_me <1> () определены и используются из lib1.so, а print_me <2> () определены и использованы для моего исполняемого файла (проверено с помощью nm --defined-only ). Но похоже, что это не так! Символы для 0 и 1 хорошо определены в lib1.so, но какслабый символы. И переопределены в моем исполняемом файле (0, 1 и 2) снова, слабый. Это означает, что код для 0 и 1 для моего исполняемого файла взят из main.cpp, а это не то, что я хочу (я проверил со спецификацией в main.cpp).
Есть ли способ (например, в lib1.h) сказать во время компиляции main.cpp, что символы где-то уже определены и что нет необходимости добавлять эти символы?