2012-08-14 19 views
2

我使用GNU自動工具的一個項目,與Makefile.am一個部分,看起來像這樣:LIBADD不會在Ubuntu上添加一個libtool庫到另一個庫上?

lib_LTLIBRARIES += myproj/mysupport/libmysupport.la 
myproj_mysupport_libmysupport_la_SOURCES = myproj/mysupport/some_sources.cc 

lib_LTLIBRARIES += myproj/myapp/libmyapp.la 
myproj_myapp_libmyapp_la_SOURCES = myproj/myapp/app_logic.cc 
myproj_myapp_libmyapp_la_LIBADD = myproj/mysupport/libmysupport.la 

sbin_PROGRAMS += myproj/myapp/myapp 
myproj_myapp_myapp_SOURCES = myproj/myapp/main.cc 
myproj_myapp_myapp_LDADD = myproj/myapp/libmyapp.la 

在這裏,我有一個支持(libtool的)庫,應用程序庫和二進制文件。應用程序庫包含二進制保存main中的所有內容,這是二進制引入的唯一源代碼。

在我的Mac上,這個編譯和鏈接很好,一切都很好。在Ubuntu不過,我得到這個鏈接錯誤:

/bin/bash ./libtool --tag=CXX --mode=link g++ -Wall -Wextra -Werror -ansi -fprofile-arcs -ftest-coverage --coverage -g -O0 -fprofile-arcs -ftest-coverage -L/usr/local/lib -Wl,-rpath -Wl,/usr/local/lib -L/usr/local/lib -Wl,-rpath -Wl,/usr/local/lib -L/usr/local/lib -Wl,-rpath -Wl,/usr/local/lib -L/usr/local/lib -Wl,-rpath -Wl,/usr/local/lib -L/usr/local/lib -Wl,-rpath -Wl,/usr/local/lib -o myproj/myapp/myapp myproj/myapp/main.o myproj/myapp/libmyapp.la -lgcov -llog4cplus -lboost_filesystem-mt -lboost_iostreams-mt -lboost_program_options-mt -lboost_system-mt -lboost_thread-mt -lboost_system-mt -pthread 
libtool: link: g++ -Wall -Wextra -Werror -ansi -fprofile-arcs -ftest-coverage --coverage -g -O0 -fprofile-arcs -ftest-coverage -Wl,-rpath -Wl,/usr/local/lib -Wl,-rpath -Wl,/usr/local/lib -Wl,-rpath -Wl,/usr/local/lib -Wl,-rpath -Wl,/usr/local/lib -Wl,-rpath -Wl,/usr/local/lib -o myproj/myapp/.libs/myapp myproj/myapp/main.o -pthread -L/usr/local/lib myproj/myapp/.libs/libmyapp.so -lgcov /usr/lib/liblog4cplus.so -lboost_filesystem-mt -lboost_iostreams-mt -lboost_program_options-mt -lboost_thread-mt -lboost_system-mt -pthread 
/usr/bin/ld: myproj/myapp/main.o: undefined reference to symbol 'myproj::mysupport::Application::main(sauce::Modules&, int, char**)' 
/usr/bin/ld: note: 'myproj::mysupport::Application::main(sauce::Modules&, int, char**)' is defined in DSO /home/user/code/local-myproj/debug/myproj/mysupport/.libs/libmysupport.so.0 so try adding it to the linker command line 
/home/user/code/local-myproj/debug/myproj/mysupport/.libs/libmysupport.so.0: could not read symbols: Invalid operation 
collect2: ld returned 1 exit status 

這裏是我的Mac相當於libtool的命令運行:

/bin/sh ./libtool --tag=CXX --mode=link g++-4.2 -Wall -Wextra -Werror -ansi -fprofile-arcs -ftest-coverage --coverage -g -O0 -fprofile-arcs -ftest-coverage -L/usr/local/lib -Wl,-rpath -Wl,/usr/local/lib -L/usr/local/lib -Wl,-rpath -Wl,/usr/local/lib -L/usr/local/lib -Wl,-rpath -Wl,/usr/local/lib -L/usr/local/lib -Wl,-rpath -Wl,/usr/local/lib -L/usr/local/lib -Wl,-rpath -Wl,/usr/local/lib -o myproj/myapp/myapp myproj/myapp/main.o myproj/myapp/libmyapp.la -lgcov -llog4cplus -L/usr/local/lib -lintl -R/usr/local/lib -Wl,-framework -Wl,CoreFoundation -lboost_filesystem-mt -lboost_iostreams-mt -lboost_program_options-mt -lboost_system-mt -lboost_thread-mt -lboost_system-mt 
libtool: link: g++-4.2 -Wall -Wextra -Werror -ansi -fprofile-arcs -ftest-coverage --coverage -g -O0 -fprofile-arcs -ftest-coverage -Wl,-rpath -Wl,/usr/local/lib -Wl,-rpath -Wl,/usr/local/lib -Wl,-rpath -Wl,/usr/local/lib -Wl,-rpath -Wl,/usr/local/lib -Wl,-rpath -Wl,/usr/local/lib -o myproj/myapp/.libs/myapp myproj/myapp/main.o -Wl,-framework -Wl,CoreFoundation -Wl,-bind_at_load -L/usr/local/lib myproj/myapp/.libs/libmyapp.dylib /home/user/code/myproj/debug/myproj/mysupport/.libs/libmysupport.dylib -lgcov -llog4cplus -lintl -lboost_filesystem-mt -lboost_iostreams-mt -lboost_program_options-mt -lboost_thread-mt -lboost_system-mt 

一個關鍵的區別似乎是/home/user/code/myproj/debug/myproj/mysupport/.libs/libmysupport.dylib出現在libtool:回聲第二個變體。事實上,如果我在ubuntu命令中使用等價參數,它會成功完成。

缺少的參數對應於Makefile.am中的LIBADD行。所以,這個問題:我做對了嗎?如果是這樣,爲什麼它在OS X而不是Ubuntu上工作?

相關的一些版本的OS X:

$ autoconf --version 
autoconf (GNU Autoconf) 2.69 
Copyright (C) 2012 Free Software Foundation, Inc. 
License GPLv3+/Autoconf: GNU GPL version 3 or later 
<http://gnu.org/licenses/gpl.html>, <http://gnu.org/licenses/exceptions.html> 
This is free software: you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law. 

Written by David J. MacKenzie and Akim Demaille. 
$ automake --version 
automake (GNU automake) 1.12.2 
Copyright (C) 2012 Free Software Foundation, Inc. 
License GPLv2+: GNU GPL version 2 or later <http://gnu.org/licenses/gpl-2.0.html> 
This is free software: you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law. 

Written by Tom Tromey <[email protected]> 
     and Alexandre Duret-Lutz <[email protected]>. 
$ libtool -V 
Apple Inc. version cctools-822 
$ g++-4.2 --version 
i686-apple-darwin11-g++-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5666) (dot 3) 
Copyright (C) 2007 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. There is NO 
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 

現在在Ubuntu:

$ autoconf --version 
autoconf (GNU Autoconf) 2.68 
Copyright (C) 2010 Free Software Foundation, Inc. 
License GPLv3+/Autoconf: GNU GPL version 3 or later 
<http://gnu.org/licenses/gpl.html>, <http://gnu.org/licenses/exceptions.html> 
This is free software: you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law. 

Written by David J. MacKenzie and Akim Demaille. 
$ automake --version 
automake (GNU automake) 1.11.3 
Copyright (C) 2011 Free Software Foundation, Inc. 
License GPLv2+: GNU GPL version 2 or later <http://gnu.org/licenses/gpl-2.0.html> 
This is free software: you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law. 

Written by Tom Tromey <[email protected]> 
     and Alexandre Duret-Lutz <[email protected]>. 
$ libtool --version 
libtool (GNU libtool) 2.4.2 
Written by Gordon Matzigkeit <[email protected]>, 1996 

Copyright (C) 2011 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. There is NO 
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
$ g++ --version 
g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3 
Copyright (C) 2011 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. There is NO 
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 

回答

2

你確實需要安裝您的支持庫?因爲你可以嘗試在noinst_LTLIBRARIES中聲明它,然後看看是否有效。

+0

工作!不,我不需要安裝支持庫,假設我仍然可以在沒有它們的情況下運行我的二進制文件。不過,我不明白:爲什麼我以前的方法沒有工作? – phs 2012-08-14 07:30:27

+0

我認爲這是因爲'noinst_'和'check_'是爲了方便庫:http://www.gnu.org/software/automake/manual/html_node/Libtool-Convenience-Libraries.html – 2012-08-14 10:36:19

相關問題