2016-12-09 2 views
0

C++ライブラリをテストしようとしていますが、AC_SEARCH_LIBSまたはAC_CHECK_LIBより少ししか処理する必要がありません。しかし、私のリンカーは、オプションの順序について不安です(g ++バージョン5.4.0)。私はBamtoolsが私のシステムにインストールされていることを知っているリンカーオプションの順番のため、AC_LANG_PROGRAMがリンカーステージに失敗しました

AC_LINK_IFELSE(
     [AC_LANG_PROGRAM([#include <api/BamReader.h>], [BamTools::BamReader dummy])], 
     [TEST_LIBS=="$TEST_LIBS -lbamtools"] [HAVE_BAMTOOLS=1], 
     [AC_MSG_WARN([libbamtools is not installed])]) 

私configure.acは、次のコードが含まれています。これにより、否定的な結果が生成されます。

checking api/BamReader.h usability... yes 
checking api/BamReader.h presence... no 
configure: WARNING: api/BamReader.h: accepted by the compiler, rejected by the preprocessor! 
configure: WARNING: api/BamReader.h: proceeding with the compiler's result 
checking for api/BamReader.h... yes 
configure: WARNING: libbamtools is not installed <-- this line 

調査の結果、リンカオプションの順に表示されます。ヨーヨーが最後まで-lbamtoolsを置くことによって順序を切り替えた場合のautoconfマクロが

g++ -o conftest -g -O2 -I/usr/local/include/bamtools -L/usr/local/lib/bamtools -lbamtools conftest.cpp/tmp/ccZiV1J9.o: In function `main': 
/home/kzhou/coding/tmp/conftest.cpp:24: undefined reference to `BamTools::BamReader::BamReader()' 
/home/kzhou/coding/tmp/conftest.cpp:24: undefined reference to `BamTools::BamReader::~BamReader()' 
collect2: error: ld returned 1 exit status 

を呼び出している

#include <api/BamReader.h> 
int main() { 
    BamTools::BamReader dummy; 
    return 0; 
} 

、リンカ:

conftest.cppファイルには、次のようになります。

g++ -o conftest -g -O2 -I/usr/local/include/bamtools -L/usr/local/lib/bamtools conftest.cpp -lbamtools 

AC_LANG_PROGRAMを更新する必要があるのでしょうか?コメントしてください。これまで私はこの問題の良い解決策を見いだせなかった。 参照してください:

https://nerdland.net/2009/07/detecting-c-libraries-with-autotools/

+1

Diegoが指摘するように、LDFLAGSはオブジェクトまたはソースコードの前に置かれ、LIBSは後に置かれます。私の主な間違いは、これら2つの変数の使い方です。 –

答えて

2

を間違った変数にライブラリを渡しているようにこれが見えます。 LIBSにライブラリを渡していれば、autoconfが正しいことをするので、正しい位置にあるはずです。

次に、あなたが貼り付けられたコードも(代わり割り当てである=の比較である==を使用して)構文エラーがあり、そしてTEST_LIBSので、論理1は、特定のポストあなたは参照により使用される変数でした。だからそれは注文のいずれかに-lbamtoolsを設定しているものではありません。

save_LIBS=$LIBS 
LIBS="$LIBS -lbamtools" 
AC_LINK_IFELSE(
     [AC_LANG_PROGRAM([#include <api/BamReader.h>], [BamTools::BamReader dummy])], 
     [save_LIBS="$LIBS"; HAVE_BAMTOOLS=1], 
     [AC_MSG_WARN([libbamtools is not installed])]) 
LIBS=$save_LIBS 

これはあなたが探していることを行うはずですが、これはやや複雑です。 AC_CHECK_TYPEを使用して、BamTools::BamReaderが定義されているかどうかを確認することができます。

+0

Diego、ありがとう。 autotoolsを学ぶのはとても難しいです。良い本はなく、ドキュメンテーションは非常に限られています。さらに、多くの人がオートツールをマスターしているわけではありません。私は少しずつ学ぶ必要があります。 –

+0

John CalcoteのAutotoolsとAutotools Mythbusterがありますが、後者は完全な説明ではなく、既知の問題を修正しただけです。 –

+0

私はJohn Calcoteの本を読んだ。その非常に良いと全体のシステムの理解を私に与えた。この本の第2版には、C++の例がいくつか追加されるはずです。 –

関連する問題