Принудительное определение символа для экземпляра шаблона 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, что символы где-то уже определены и что нет необходимости добавлять эти символы?

Ответы на вопрос(3)

Ваш ответ на вопрос