简体   繁体   中英

How to link libaries in C++ compilation (undefined references errors)

I am new to C++ and unable to compile a C++ program written by someone else as I can't seem to link the libraries and binaries properly. I have the libraries in the same folder. Given the errors below and the structure of those directories, can anyone please tell me how to link them to remove these errors? One example of every kind of issues (binary libraries, include files) will be enough. Thanks so much in advance!

Here is the command so far that links 'curl', 'perl' and 'mysql' libraries:

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/

These are the errors it gives. Clearly, it can not find 'my_html', 'tinyxml' and 'InterOp-1.1.4-Linux-GNU' libraries/binaries.

/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*)'

All these 3 libraries are in external folder.

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

So, I figured it out. This is the compilation command (given my dir structure):

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,external/myhtml/lib -Wl,-rpath,external/tinyxml2/build/ -Wl,-rpath,external/InterOp-1.1.4-Linux-GNU/lib64/

First, I searched for the modules that were being referenced to (undefined reference error) using grep in that dir and found the.so file that had them and used this post:

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

Then after compilation, during running it gave errors like:

error while loading shared libraries: libc_csharp_run_metrics.so: cannot open shared object file: No such file or directory

So, used this post (added '-Wl,-rpath,/path/to/lib' for those corresponding libraries): error while loading shared libraries

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM