如何在C ++编译中链接库(未定义的引用错误)

问题描述 投票:0回答:1

我是C ++的新手,由于我似乎无法正确链接库和二进制文件,因此无法编译其他人编写的C ++程序。我将库放在同一文件夹中。鉴于以下错误以及这些目录的结构,有人可以告诉我如何链接它们以消除这些错误吗?每种问题(二进制库,包含文件)的一个示例就足够了。非常感谢!

到目前为止,这里是链接'curl','perl'和'mysql'库的命令:

g ++ -o myscript myscript.cpp -Iexternal / rapidjson / include -Iexternal / tinyxml2 / tinyxml2 / -Iexternal / InterOp-1.1.4-Linux-GNU / include / -I / usr / include / mysql / -I / usr / lib64 / perl5 / CORE / -Iexternal / myhtml / source /'mysql_config --cflags -libs'-lcurl -Wl,-E -Wl,-rpath,/ usr / lib64 / perl5 / CORE -fstack-protector -L / usr / lib64 / perl5 / CORE -lperl -lresolv -lnsl -ldl -lm -lcrypt -lutil -lpthread -lc -D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -pipe -fstack-protector -I / usr / local / include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS = 64 -I / usr / lib64 / perl5 / CORE -Lexternal / tinyxml2 / tinyxml2 / -Lexternal / myhtml / lib-Iexternal / myhtml / lib /

这些是它给的错误。显然,它找不到'my_html','tinyxml'和'InterOp-1.1.4-Linux-GNU'库/二进制文件。

/tmp/ccYPh2OS.o: In function 
'html::print_node_attr(myhtml_tree_node*)':
current_dir/myscript.cpp:1323: undefined reference to 'myhtml_node_attribute_first'
current_dir/myscript.cpp:1326: undefined reference to 'myhtml_attribute_key'
current_dir/myscript.cpp:1329: undefined reference to 'myhtml_attribute_value'
current_dir/myscript.cpp:1333: undefined reference to 'myhtml_attribute_next'
/tmp/ccYPh2OS.o: In function 'html::print_tree2(myhtml_tree*, myhtml_tree_node*, unsigned long, std::vector<std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::allocator<std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > >&)':
current_dir/myscript.cpp:1341: undefined reference to 'myhtml_node_tag_id'
current_dir/myscript.cpp:1343: undefined reference to 'myhtml_node_text'
current_dir/myscript.cpp:1348: undefined reference to 'myhtml_node_tag_id'
current_dir/myscript.cpp:1350: undefined reference to 'myhtml_node_tag_id'
current_dir/myscript.cpp:1351: undefined reference to 'myhtml_node_text'
current_dir/myscript.cpp:1352: undefined reference to 'myhtml_node_next'
current_dir/myscript.cpp:1372: undefined reference to 'myhtml_node_tag_id'
current_dir/myscript.cpp:1372: undefined reference to 'myhtml_node_tag_id'
current_dir/myscript.cpp:1373: undefined reference to 'myhtml_node_text'
current_dir/myscript.cpp:1376: undefined reference to 'myhtml_node_next'
current_dir/myscript.cpp:1395: undefined reference to 'myhtml_node_child'
current_dir/myscript.cpp:1396: undefined reference to 'myhtml_node_next'
/tmp/ccYPh2OS.o: In function 'html::get_named_rows_from_fc_summary(std::vector<std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::allocator<std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > >&, char const*)':
current_dir/myscript.cpp:1403: undefined reference to 'myhtml_create'
current_dir/myscript.cpp:1404: undefined reference to 'myhtml_init'
current_dir/myscript.cpp:1406: undefined reference to 'myhtml_tree_create'
current_dir/myscript.cpp:1407: undefined reference to 'myhtml_tree_init'
current_dir/myscript.cpp:1409: undefined reference to 'myhtml_parse'
current_dir/myscript.cpp:1411: undefined reference to 'myhtml_tree_get_document'
current_dir/myscript.cpp:1412: undefined reference to 'myhtml_node_child'
current_dir/myscript.cpp:1414: undefined reference to 'myhtml_tree_destroy'
current_dir/myscript.cpp:1415: undefined reference to 'myhtml_destroy'
/tmp/ccYPh2OS.o: In function 'update_fc_table(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, tinyxml2::XMLElement*&)':
current_dir/myscript.cpp:1598: undefined reference to 'tinyxml2::XMLElement::GetText() const'
current_dir/myscript.cpp:1598: undefined reference to 'tinyxml2::XMLElement::GetText() const'
current_dir/myscript.cpp:1610: undefined reference to 'tinyxml2::XMLElement::GetText() const'
current_dir/myscript.cpp:1610: undefined reference to 'tinyxml2::XMLElement::GetText() const'
/tmp/ccYPh2OS.o: In function 'interop_bits(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::allocator<std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > >&)':
current_dir/myscript.cpp:1636: undefined reference to 'illumina::interop::logic::utils::list_summary_metrics_to_load(std::vector<unsigned char, std::allocator<unsigned char> >&, illumina::interop::constants::instrument_type)'
current_dir/myscript.cpp:1637: undefined reference to 'illumina::interop::model::metrics::run_metrics::read(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<unsigned char, std::allocator<unsigned char> > const&, unsigned long, bool)'
current_dir/myscript.cpp:1642: undefined reference to 'illumina::interop::logic::summary::summarize_run_metrics(illumina::interop::model::metrics::run_metrics&, illumina::interop::model::summary::run_summary&, bool, bool)'
current_dir/myscript.cpp:1693: undefined reference to 'tinyxml2::XMLDocument::XMLDocument(bool, tinyxml2::Whitespace)'
current_dir/myscript.cpp:1695: undefined reference to 'tinyxml2::XMLDocument::LoadFile(char const*)'
current_dir/myscript.cpp:1749: undefined reference to 'tinyxml2::XMLDocument::~XMLDocument()'
current_dir/myscript.cpp:1749: undefined reference to 'tinyxml2::XMLDocument::~XMLDocument()'
/tmp/ccYPh2OS.o: In function 'write_sample_sheet(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::allocator<std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > >&, tinyxml2::XMLElement*&, std::vector<std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::allocator<std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > >&, bool)':
current_dir/myscript.cpp:1769: undefined reference to 'tinyxml2::XMLElement::GetText() const'
/tmp/ccYPh2OS.o: In function 'print_info(tinyxml2::XMLElement*&)':
current_dir/myscript.cpp:1807: undefined reference to 'tinyxml2::XMLElement::GetText() const'
current_dir/myscript.cpp:1808: undefined reference to 'tinyxml2::XMLElement::GetText() const'
current_dir/myscript.cpp:1809: undefined reference to 'tinyxml2::XMLElement::GetText() const'
current_dir/myscript.cpp:1810: undefined reference to 'tinyxml2::XMLElement::GetText() const'
/tmp/ccYPh2OS.o:current_dir/myscript.cpp:1811: more undefined references to 'tinyxml2::XMLElement::GetText() const' follow
/tmp/ccYPh2OS.o: In function 'bcl(int, char**)':
current_dir/myscript.cpp:2506: undefined reference to 'tinyxml2::XMLDocument::XMLDocument(bool, tinyxml2::Whitespace)'
current_dir/myscript.cpp:2507: undefined reference to 'tinyxml2::XMLDocument::LoadFile(char const*)'
current_dir/myscript.cpp:2525: undefined reference to 'tinyxml2::XMLElement::GetText() const'
current_dir/myscript.cpp:2525: undefined reference to 'tinyxml2::XMLElement::GetText() const'
current_dir/myscript.cpp:2525: undefined reference to 'tinyxml2::XMLElement::GetText() const'
current_dir/myscript.cpp:2614: undefined reference to 'tinyxml2::XMLDocument::~XMLDocument()'
current_dir/myscript.cpp:2614: undefined reference to 'tinyxml2::XMLDocument::~XMLDocument()'
/tmp/ccYPh2OS.o: In function 'tinyxml2::XMLNode::FirstChildElement(char const*)':
current_dir/external/tinyxml2/tinyxml2/tinyxml2.h:777: undefined reference to 'tinyxml2::XMLNode::FirstChildElement(char const*) const'
/tmp/ccYPh2OS.o: In function 'illumina::interop::io::paths::interop_filename(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool)':
current_dir/external/InterOp-1.1.4-Linux-GNU/include/interop/io/paths.h:140: undefined reference to 'illumina::interop::io::basename(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
current_dir/external/InterOp-1.1.4-Linux-GNU/include/interop/io/paths.h:142: undefined reference to 'illumina::interop::io::basename(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
current_dir/external/InterOp-1.1.4-Linux-GNU/include/interop/io/paths.h:143: undefined reference to 'illumina::interop::io::combine(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
current_dir/external/InterOp-1.1.4-Linux-GNU/include/interop/io/paths.h:144: undefined reference to 'illumina::interop::io::combine(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
/tmp/ccYPh2OS.o: In function 'illumina::interop::io::paths::interop_directory_name(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
current_dir/external/InterOp-1.1.4-Linux-GNU/include/interop/io/paths.h:153: undefined reference to 'illumina::interop::io::combine(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
/tmp/ccYPh2OS.o: In function 'void illumina::interop::io::read_interop<illumina::interop::model::metric_base::metric_set<illumina::interop::model::metrics::tile_metric> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, illumina::interop::model::metric_base::metric_set<illumina::interop::model::metrics::tile_metric>&, bool)':
current_dir/external/InterOp-1.1.4-Linux-GNU/include/interop/io/metric_file_stream.h:150: undefined reference to 'illumina::interop::io::file_size(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
/tmp/ccYPh2OS.o: In function 'illumina::interop::io::metric_format_factory<illumina::interop::model::metrics::tile_metric>::metric_formats()':
current_dir/external/InterOp-1.1.4-Linux-GNU/include/interop/io/format/metric_format_factory.h:78: undefined reference to 'illumina::interop::io::force_link_metric_format(illumina::interop::model::metrics::tile_metric*)'

所有这三个库都在外部文件夹中。

ls -l external/
drwx--S---  6 pipe pipe 4096 Nov  1 16:13 InterOp-1.1.4-Linux-GNU
drwx--S--- 13 pipe pipe 4096 Nov  1 16:13 myhtml
drwxrws--- 12 pipe pipe 4096 Nov  1 16:13 rapidjson
drwx--S---  4 pipe pipe 4096 Nov  1 16:12 tinyxml2

ls -l external/InterOp-1.1.4-Linux-GNU/
drwxr-sr-x 2 pipe pipe  4096 Nov  1 16:12 bin
-rw-r--r-- 1 pipe pipe 15595 Nov  1 16:12 changes.md
drwxr-sr-x 3 pipe pipe  4096 Nov  1 16:13 include
drwxr-sr-x 3 pipe pipe  4096 Nov  1 16:12 lib64
-rw-r--r-- 1 pipe pipe  5585 Nov  1 16:12 README.md
drwxr-sr-x 3 pipe pipe  4096 Nov  1 16:12 share


ls -l external/myhtml/
-rwxr-xr-x 1 pipe pipe 1849356 Nov  1 16:13 a.out
-rw-r--r-- 1 pipe pipe    8486 Nov  1 16:13 api_breaking_changes.md
drwxr-sr-x 3 pipe pipe    4096 Nov  1 16:13 bin
-rw-r--r-- 1 pipe pipe   10198 Nov  1 16:13 CHANGELOG.md
-rw-r--r-- 1 pipe pipe    8726 Nov  1 16:13 CMakeLists.txt
drwxr-sr-x 3 pipe pipe    4096 Nov  1 16:13 debian
drwxr-sr-x 3 pipe pipe    4096 Nov  1 16:13 devel
drwxr-sr-x 3 pipe pipe    4096 Nov  1 16:13 examples
drwxr-sr-x 5 pipe pipe    4096 Nov  1 16:13 include
-rw-r--r-- 1 pipe pipe    1724 Nov  1 16:13 INSTALL.md
drwxr-sr-x 2 pipe pipe    4096 Nov  1 16:13 lib
-rw-r--r-- 1 pipe pipe   24477 Nov  1 16:13 LICENSE
-rw-r--r-- 1 pipe pipe    8137 Nov  1 16:13 Makefile
-rw-r--r-- 1 pipe pipe    1275 Nov  1 16:13 Makefile.bin.cfg
-rw-r--r-- 1 pipe pipe    4717 Nov  1 16:13 Makefile.cfg
-rw-r--r-- 1 pipe pipe     279 Nov  1 16:13 myhtml.pc
-rw-r--r-- 1 pipe pipe     212 Nov  1 16:13 myhtml.pc.in
-rw-r--r-- 1 pipe pipe    6210 Nov  1 16:13 README.md
drwxr-sr-x 2 pipe pipe    4096 Nov  1 16:13 rpm
drwxr-sr-x 6 pipe pipe    4096 Nov  1 16:13 source
drwxr-sr-x 2 pipe pipe    4096 Nov  1 16:13 test
drwxr-sr-x 2 pipe pipe    4096 Nov  1 16:13 test_suite

ls -l external/tinyxml2/
-rwxr-x--- 1 pipe pipe 98466 Nov  1 16:12 a.out
drwxrws--- 5 pipe pipe  4096 Nov  1 16:12 build
-rwxr-x--- 1 pipe pipe  1131 Nov  1 16:12 tinytest.cpp
drwxrws--- 7 pipe pipe  4096 Nov  1 16:12 tinyxml2
c++ compilation g++ libraries
1个回答
0
投票

所以,我知道了。这是编译命令(基于我的目录结构):

g ++ -o myscript myscript.cpp -Iexternal / rapidjson / include -Iexternal / tinyxml2 / tinyxml2 / -Iexternal / InterOp-1.1.4-Linux-GNU / include / -I / usr / include / mysql / -I / usr / lib64 / perl5 / CORE / -Iexternal / myhtml / source /`mysql_config –cflags –libs` -Wl,-E -Wl,-rpath,/ usr / lib64 / perl5 / CORE -fstack-protector -L / usr / lib64 / perl5 / CORE -lperl -lresolv -lnsl -ldl -lm -lcrypt -lutil -lpthread -lc -D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -pipe -fstack-protector -I / usr / local / include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS = 64 -I / usr / lib64 / perl5 / CORE -lcurl -Lexternal / myhtml / lib -lmyhtml-4.0 -Lexternal / tinyxml2 / build / -ltinyxml2 -Lexternal / InterOp-1.1.4-Linux-GNU / lib64 / -lc_csharp_run_metrics -Lexternal / InterOp-1.1.4-Linux-GNU / lib64 -lc_csharp_summary -Wl,-rpath,外部/ myhtml / lib -Wl,-rpath,外部/ tinyxml2 / build / -Wl,-rpath,外部/InterOp-1.1 .4-Linux-GNU / lib64 /

首先,我在该目录中使用grep搜索了被引用的模块(未定义的引用错误),并找到了包含它们的.so文件并使用了这篇文章:

How do I include a path to libraries in g++

然后在编译后,在运行期间出现了如下错误:

加载共享库时出错:libc_csharp_run_metrics.so:无法打开共享库文件:没有这样的文件或目录

因此,使用了这篇文章(为那些相应的库添加了'-Wl,-rpath,/ path / to / lib'):error while loading shared libraries

© www.soinside.com 2019 - 2024. All rights reserved.