2016-05-03 58 views
0

をコンパイルするとき、私はいくつかの.cppと.hファイルでプロジェクトを持っている、と私は、コア/汎用的なもの、およびアプリケーション固有のコードにソースを分割しようとしています。それに基づいて、コードファイルをCommonフォルダに分割し、ライブラリとしてコンパイルしました。そのlibのMakefileは以下の通りです:リンカエラー静的ライブラリと

次に、そのライブラリを使用しているアプリケーションのコンパイルを試みるためにサンプルのメインファイルを作成しました。ここで

はメインソースファイルのコードです:

#include "../Common/Functions.h" 
#include "../Common/Logger.h" 

int main() { 
    Logger::Init(false, false); 
    Logger::Debug("Test"); 
    string path = Functions::GetAppPath(); 
    Logger::Debug("App Path: ", path.c_str()); 
    return 0; 
} 

参照されている機能のファイルがライブラリ使用しています、このアプリのためにメイクファイルをブーストを使用し、ここにある:

CC=g++ 
CFLAGS=-Wl,--verbose -std=c++11 -g -c -pedantic -Wall -Wextra -I../boost_1_57_0 -L../boost_1_57_0/stage/lib 
LDFLAGS=-I../boost_1_57_0 -L../boost_1_57_0/stage/lib -L../boost_libs/lib -L/usr/lib64 -L/usr/kerberos/lib -L/usr/lib -L../Common 
LIBS=-lz -lkrb5 -lk5crypto -lcom_err -lresolv -lm -lpthread -lrt -lboost_system -lboost_filesystem -lboost_thread -lboost_date_time -rdynamic -lcurl -lcommon 
SOURCES = $(wildcard *.cpp) 
OBJECTS=$(SOURCES:.cpp=.o) 
EXECUTABLE=testApp 
GPROF=-pg 

all: $(SOURCES) $(EXECUTABLE) 

$(EXECUTABLE): $(OBJECTS) 
    $(CC) $(LDFLAGS) $(OBJECTS) -o [email protected] $(LIBS) $(GPROF) 

.cpp.o: 
    $(CC) $(CPPFLAGS) $(CFLAGS) $< -o [email protected] $(GPROF) 

clean: 
    rm -rf *o $(OBJECTS) 

私がコンパイルしようとすると、私が後押しする未定義の参照不満、次のエラーを取得:

g++ -Wl,--verbose -std=c++11 -g -c -pedantic -Wall -Wextra -I../boost_1_57_0 -L../boost_1_57_0/stage/lib main.cpp -o main.o -pg 
g++ -I../boost_1_57_0 -L../boost_1_57_0/stage/lib -L../boost_libs/lib -L/usr/lib64 -L/usr/kerberos/lib -L/usr/lib -L../Common main.o -o testApp -lz -lkrb5 -lk5crypto -lcom_err -lresolv -lm -lpthread -lrt -lboost_system -lboost_filesystem -lboost_thread -lboost_date_time -rdynamic -lcurl -lcommon -pg 
../Common/libcommon.a(Functions.o): In function `Functions::GetAppPath()': 
/media/software/Robots/Common/Functions.cpp:43: undefined reference to `boost::filesystem::path::parent_path() const' 
../Common/libcommon.a(Functions.o): In function `boost::filesystem::initial_path()': 
/media/software/Robots/Common/../boost_1_57_0/boost/filesystem/operations.hpp:583: undefined reference to `boost::filesystem::detail::initial_path(boost::system::error_code*)' 
../Common/libcommon.a(Functions.o): In function `boost::filesystem::system_complete(boost::filesystem::path const&)': 
/media/software/Robots/Common/../boost_1_57_0/boost/filesystem/operations.hpp:655: undefined reference to `boost::filesystem::detail::system_complete(boost::filesystem::path const&, boost::system::error_code*)' 
../Common/libcommon.a(Functions.o): In function `unsigned short boost::date_time::month_str_to_ushort<boost::gregorian::greg_month>(std::string const&)': 
/media/software/Robots/Common/../boost_1_57_0/boost/date_time/date_parsing.hpp:67: undefined reference to `boost::gregorian::greg_month::get_month_map_ptr()' 
../Common/libcommon.a(Logger.o): In function `Logger::Cleanup()': 
/media/software/Robots/Common/Logger.cpp:84: undefined reference to `boost::thread::interrupt()' 
../Common/libcommon.a(Logger.o): In function `Logger::InitFile(std::string, bool, std::_Ios_Openmode)': 
/media/software/Robots/Common/Logger.cpp:186: undefined reference to `boost::filesystem::path::parent_path() const' 
/media/software/Robots/Common/Logger.cpp:187: undefined reference to `boost::filesystem::path::parent_path() const' 
../Common/libcommon.a(Logger.o): In function `Logger::Process()': 
/media/software/Robots/Common/Logger.cpp:241: undefined reference to `boost::this_thread::interruption_point()' 
../Common/libcommon.a(Logger.o): In function `boost::detail::thread_data_base::thread_data_base()': 
/media/software/Robots/Common/../boost_1_57_0/boost/thread/pthread/thread_data.hpp:143: undefined reference to `vtable for boost::detail::thread_data_base' 
../Common/libcommon.a(Logger.o): In function `boost::thread::start_thread()': 
/media/software/Robots/Common/../boost_1_57_0/boost/thread/detail/thread.hpp:179: undefined reference to `boost::thread::start_thread_noexcept()' 
../Common/libcommon.a(Logger.o): In function `boost::thread::~thread()': 
/media/software/Robots/Common/../boost_1_57_0/boost/thread/detail/thread.hpp:254: undefined reference to `boost::thread::detach()' 
../Common/libcommon.a(Logger.o): In function `boost::thread::get_id() const': 
/media/software/Robots/Common/../boost_1_57_0/boost/thread/detail/thread.hpp:741: undefined reference to `boost::thread::native_handle()' 
../Common/libcommon.a(Logger.o): In function `boost::thread::join()': 
/media/software/Robots/Common/../boost_1_57_0/boost/thread/detail/thread.hpp:767: undefined reference to `boost::thread::join_noexcept()' 
../Common/libcommon.a(Logger.o): In function `boost::filesystem::exists(boost::filesystem::path const&)': 
/media/software/Robots/Common/../boost_1_57_0/boost/filesystem/operations.hpp:404: undefined reference to `boost::filesystem::detail::status(boost::filesystem::path const&, boost::system::error_code*)' 
../Common/libcommon.a(Logger.o): In function `boost::filesystem::create_directories(boost::filesystem::path const&)': 
/media/software/Robots/Common/../boost_1_57_0/boost/filesystem/operations.hpp:523: undefined reference to `boost::filesystem::detail::create_directories(boost::filesystem::path const&, boost::system::error_code*)' 
../Common/libcommon.a(Logger.o): In function `boost::detail::thread_data<void (*)()>::~thread_data()': 
/media/software/Robots/Common/../boost_1_57_0/boost/thread/detail/thread.hpp:90: undefined reference to `boost::detail::thread_data_base::~thread_data_base()' 
../Common/libcommon.a(Logger.o):(.rodata._ZTIN5boost6detail11thread_dataIPFvvEEE[_ZTIN5boost6detail11thread_dataIPFvvEEE]+0x10): undefined reference to `typeinfo for boost::detail::thread_data_base' 
collect2: error: ld returned 1 exit status 

プロジェクト全体が問題なくコンパイルされることは言うまでもありません。

これは、C++、Linuxのライブラリを構築し、別のアプリケーションでそれを使用しての私の最初の試みですので、私は新人のミスをやっているかもしれないので、心の中でそれを負担します。

助けを非常に感謝します。

ありがとうございます。

+0

@ n.m。まあ、私がエラーの原因を知っていたら、私はこれを重複した質問と考えています。私は原因を知らないので、問題は重複していません。それがなぜ起こるのか尋ねれば、それは重複しているだろう。 – BlunT

+0

n.m.原因を知っていました:-) – TylerH

答えて

1

コマンドラインでライブラリの順序は、リンカに重要です。ライブラリを左から右に処理し、現在のライブラリによって提供されているすべての関数に対して、すでに認識されている未解決の参照を解決します。

また

、そして与えられたライブラリは、それ自体が、その後、リンカーは、それがすでに処理しているライブラリに対してそれらを解決しません提供していない機能への参照が含まれている場合は、ここでは特に関連。だからあなたは未解決の参照を持っています:-lcommonがあなたのライブラリの最後にあるので、その中の関数参照はC標準ライブラリに対してのみ解決されます。

リンクコマンドで複数回のライブラリを一覧表示するには有効であり、時にはそれが必要とされているが、この場合、私はそれが単に代わりに、最後の最初のライブラリとして-lcommonを置くことは理にかなって思います。これで問題は解決します。ライブラリをリンクコマンドの中でそれに最も近いメインプログラムに最も密接に関連付けることは、概念化することさえできます。

+0

これに取り組むには長い時間がかかりましたが、誰がこれを注文したと思ったでしょうか...ありがとう! – BlunT

関連する問題