テンプレート コードを提供するライブラリを提供したいと思います。ただし、テンプレートのさまざまな通常のタイプの使用法を推測できる場合は、このコード (生成されたコード) の所有権を可能な限り維持したいと考えています。これが私がやろうとしていることの例です:
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++ -共有 -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 の仕様で確認しました)。
シンボルが既にどこかで定義されており、これらのシンボルを追加する必要がないことを main.cpp のコンパイル時に (たとえば lib1.h で) 言う方法はありますか?