次の手順で共有ライブラリを構築しています。
cc -shared -Wl,-soname,libmy.so.0 [lots of .o files] -o libmy.so.0
ln -f -s libmy.so.0 libmy.so
これが重要かどうかはわかりませんが、このライブラリは C で書かれています。
次に、C++ プログラムからこのライブラリにリンクしようとします。
/usr/bin/c++ -g CMakeFiles/codegen.dir/client/codegen.cpp.o CMakeFiles/codegen.dir
/namenode/shared_objects.cpp.o -o codegen -rdynamic -L/path/to/libmy -lpthread
-lboost_system-mt -lboost_filesystem-mt -lboost_unit_test_framework-mt
-lboost_serialization-mt -lmy -Wl,-rpath,/path/to/libmy
しかし ld はエラーを報告します:
CMakeFiles/codegen.dir/client/codegen.cpp.o: In function `main':
[...]/src/client/codegen.cpp:46:
undefined reference to `alloc_code(int, int, int, int, int)'
alloc_code
共有ライブラリにあるように見えても:
$ nm libmy.so | grep alloc_code
0000000000002c80 T alloc_code
libmy.so
私のプログラムは異なるコンパイラフラグを使用してコンパイルされていることに注意してくださいcodegen
(1つはデバッグモードでコンパイルされ、もう1つは最適化モードでコンパイルされます)が、問題はここから来るとは思いません。
とld
リンクできない原因は何ですか?codegen
libmy.so