UPDATE
Solved the issue. The was the structure of the g++ command. This one worked for me:
g++ tutorial.cpp -I/opt/local/include -I/usr/include/boost -L/opt/local/lib -lmongoclient -lboost_thread -lboost_system -lboost_regex -o tutorial
OS: Ubuntu 16.04 64-bit
Following this tutorial:
https://mongodb.github.io/mongo-cxx-driver/legacy-v1/tutorial/
I'm able to build the mongodb-client using SCons with no issue.
mongo folder of header files here:
/opt/local/include
libmongoclient.a file here:
/opt/local/lib
Code is as follows, same as the tutorial:
#include <cstdlib>
#include <iostream>
#include "mongo/client/dbclient.h" // for the driver
void run() {
mongo::DBClientConnection c;
c.connect("localhost");
}
int main() {
mongo::client::initialize();
try {
run();
std::cout << "connected ok" << std::endl;
} catch( const mongo::DBException &e ) {
std::cout << "caught " << e.what() << std::endl;
}
return EXIT_SUCCESS;
}
This is the command I'm using to compile:
g++ -I/opt/local/include -L/opt/local/lib -pthread -lmongoclient -lboost_thread -lboost_system -lboost_filesystem -lboost_program_options tutorial.cpp -o tutorial
I receive the following error
/tmp/cceJe78D.o: In function `run()':
tutorial.cpp:(.text+0x34): undefined reference to `mongo::DBClientConnection::DBClientConnection(bool, mongo::DBClientReplicaSet*, double)'
/tmp/cceJe78D.o: In function `main':
tutorial.cpp:(.text+0x12f): undefined reference to `mongo::client::Options::Options()'
tutorial.cpp:(.text+0x148): undefined reference to `mongo::client::initialize(mongo::client::Options const&)'
/tmp/cceJe78D.o: In function `__static_initialization_and_destruction_0(int, int)':
tutorial.cpp:(.text+0x299): undefined reference to `boost::system::generic_category()'
tutorial.cpp:(.text+0x2a5): undefined reference to `boost::system::generic_category()'
tutorial.cpp:(.text+0x2b1): undefined reference to `boost::system::system_category()'
/tmp/cceJe78D.o: In function `mongo::DBException::DBException(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)':
tutorial.cpp:(.text._ZN5mongo11DBExceptionC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEi[_ZN5mongo11DBExceptionC5ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEi]+0x21): undefined reference to `vtable for mongo::DBException'
/tmp/cceJe78D.o: In function `mongo::DBException::~DBException()':
tutorial.cpp:(.text._ZN5mongo11DBExceptionD2Ev[_ZN5mongo11DBExceptionD5Ev]+0x10): undefined reference to `vtable for mongo::DBException'
/tmp/cceJe78D.o: In function `mongo::DBException::addContext(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
tutorial.cpp:(.text._ZN5mongo11DBException10addContextERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE[_ZN5mongo11DBException10addContextERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE]+0x33): undefined reference to `mongo::causedBy(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
/tmp/cceJe78D.o: In function `mongo::UserException::UserException(int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
tutorial.cpp:(.text._ZN5mongo13UserExceptionC2EiRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE[_ZN5mongo13UserExceptionC5EiRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE]+0x2a): undefined reference to `vtable for mongo::UserException'
/tmp/cceJe78D.o: In function `mongo::UserException::~UserException()':
tutorial.cpp:(.text._ZN5mongo13UserExceptionD2Ev[_ZN5mongo13UserExceptionD5Ev]+0xd): undefined reference to `vtable for mongo::UserException'
/tmp/cceJe78D.o: In function `mongo::DBClientConnection::~DBClientConnection()':
tutorial.cpp:(.text._ZN5mongo18DBClientConnectionD2Ev[_ZN5mongo18DBClientConnectionD5Ev]+0xe): undefined reference to `vtable for mongo::DBClientConnection'
tutorial.cpp:(.text._ZN5mongo18DBClientConnectionD2Ev[_ZN5mongo18DBClientConnectionD5Ev]+0x1a): undefined reference to `vtable for mongo::DBClientConnection'
tutorial.cpp:(.text._ZN5mongo18DBClientConnectionD2Ev[_ZN5mongo18DBClientConnectionD5Ev]+0x2c): undefined reference to `mongo::DBClientConnection::_numConnections'
tutorial.cpp:(.text._ZN5mongo18DBClientConnectionD2Ev[_ZN5mongo18DBClientConnectionD5Ev]+0xbb): undefined reference to `mongo::DBClientBase::~DBClientBase()'
tutorial.cpp:(.text._ZN5mongo18DBClientConnectionD2Ev[_ZN5mongo18DBClientConnectionD5Ev]+0x189): undefined reference to `mongo::DBClientBase::~DBClientBase()'
/tmp/cceJe78D.o: In function `mongo::DBClientConnection::connect(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
tutorial.cpp:(.text._ZN5mongo18DBClientConnection7connectERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE[_ZN5mongo18DBClientConnection7connectERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE]+0x78): undefined reference to `mongo::HostAndPort::HostAndPort(mongo::StringData const&)'
/tmp/cceJe78D.o:(.gcc_except_table+0x50): undefined reference to `typeinfo for mongo::DBException'
/tmp/cceJe78D.o:(.rodata._ZTVN5mongo16ConnectExceptionE[_ZTVN5mongo16ConnectExceptionE]+0x30): undefined reference to `mongo::UserException::appendPrefix(std::__cxx11::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >&) const'
/tmp/cceJe78D.o:(.rodata._ZTVN5mongo16ConnectExceptionE[_ZTVN5mongo16ConnectExceptionE]+0x40): undefined reference to `mongo::DBException::toString[abi:cxx11]() const'
/tmp/cceJe78D.o:(.rodata._ZTVN5mongo18AssertionExceptionE[_ZTVN5mongo18AssertionExceptionE]+0x40): undefined reference to `mongo::DBException::toString[abi:cxx11]() const'
/tmp/cceJe78D.o:(.rodata._ZTIN5mongo16ConnectExceptionE[_ZTIN5mongo16ConnectExceptionE]+0x10): undefined reference to `typeinfo for mongo::UserException'
/tmp/cceJe78D.o:(.rodata._ZTIN5mongo18AssertionExceptionE[_ZTIN5mongo18AssertionExceptionE]+0x10): undefined reference to `typeinfo for mongo::DBException'
collect2: error: ld returned 1 exit status
I've searched around Google, and saw some people with the same issue, but they didn't appear to be linking files correctly. As far as I can tell I'm doing everything correctly.
Any help would be greatly appreciated.
EDIT
Output if I change the command to:
g++ tutorial.cpp -I/opt/local/include -I/usr/include/boost -L/opt/local/lib -pthread -lmongoclient -lboost_thread -lboost_system -lboost_filesystem -lboost_program_options -o tutorial
/opt/local/lib/libmongoclient.a(dbclient.o): In function `boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::assign(char const*, char const*, unsigned int)':
/usr/include/boost/regex/v4/basic_regex.hpp:380: undefined reference to `boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::do_assign(char const*, char const*, unsigned int)'
/opt/local/lib/libmongoclient.a(dbclient.o): In function `boost::re_detail::perl_matcher<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::unwind_extra_block(bool)':
/usr/include/boost/regex/v4/perl_matcher_non_recursive.hpp:1135: undefined reference to `boost::re_detail::put_mem_block(void*)'
/opt/local/lib/libmongoclient.a(dbclient.o): In function `boost::cpp_regex_traits<char>::transform_primary(char const*, char const*) const':
/usr/include/boost/regex/v4/cpp_regex_traits.hpp:965: undefined reference to `boost::re_detail::cpp_regex_traits_implementation<char>::transform_primary(char const*, char const*) const'
/opt/local/lib/libmongoclient.a(dbclient.o): In function `boost::cpp_regex_traits<char>::transform(char const*, char const*) const':
/usr/include/boost/regex/v4/cpp_regex_traits.hpp:961: undefined reference to `boost::re_detail::cpp_regex_traits_implementation<char>::transform(char const*, char const*) const'
/opt/local/lib/libmongoclient.a(dbclient.o): In function `void boost::re_detail::raise_error<boost::regex_traits_wrapper<boost::regex_traits<char, boost::cpp_regex_traits<char> > > >(boost::regex_traits_wrapper<boost::regex_traits<char, boost::cpp_regex_traits<char> > > const&, boost::regex_constants::error_type)':
/usr/include/boost/regex/pattern_except.hpp:75: undefined reference to `boost::re_detail::raise_runtime_error(std::runtime_error const&)'
/opt/local/lib/libmongoclient.a(dbclient.o): In function `boost::re_detail::cpp_regex_traits_implementation<char>::error_string(boost::regex_constants::error_type) const':
/usr/include/boost/regex/v4/cpp_regex_traits.hpp:448: undefined reference to `boost::re_detail::get_default_error_string(boost::regex_constants::error_type)'
/opt/local/lib/libmongoclient.a(dbclient.o): In function `boost::re_detail::perl_matcher<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::extend_stack()':
/usr/include/boost/regex/v4/perl_matcher_non_recursive.hpp:213: undefined reference to `boost::re_detail::get_mem_block()'
/opt/local/lib/libmongoclient.a(dbclient.o): In function `boost::re_detail::save_state_init::save_state_init(boost::re_detail::saved_state**, boost::re_detail::saved_state**)':
/usr/include/boost/regex/v4/perl_matcher_non_recursive.hpp:107: undefined reference to `boost::re_detail::get_mem_block()'
/opt/local/lib/libmongoclient.a(dbclient.o): In function `boost::re_detail::perl_matcher<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::match_imp()':
/usr/include/boost/regex/v4/perl_matcher_common.hpp:208: undefined reference to `boost::re_detail::verify_options(unsigned int, boost::regex_constants::_match_flags)'
/opt/local/lib/libmongoclient.a(dbclient.o): In function `boost::re_detail::save_state_init::~save_state_init()':
/usr/include/boost/regex/v4/perl_matcher_non_recursive.hpp:115: undefined reference to `boost::re_detail::put_mem_block(void*)'
/opt/local/lib/libmongoclient.a(dbclient.o): In function `boost::re_detail::perl_matcher<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::match_prefix()':
/usr/include/boost/regex/v4/perl_matcher_common.hpp:333: undefined reference to `boost::match_results<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >::maybe_assign(boost::match_results<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > const&)'
/opt/local/lib/libmongoclient.a(dbclient.o): In function `boost::re_detail::save_state_init::~save_state_init()':
/usr/include/boost/regex/v4/perl_matcher_non_recursive.hpp:115: undefined reference to `boost::re_detail::put_mem_block(void*)'
/opt/local/lib/libmongoclient.a(dbclient.o): In function `boost::re_detail::perl_matcher<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::perl_matcher(__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::match_results<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >&, boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > > const&, boost::regex_constants::_match_flags, __gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >)':
/usr/include/boost/regex/v4/perl_matcher.hpp:365: undefined reference to `boost::re_detail::perl_matcher<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::construct_init(boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > > const&, boost::regex_constants::_match_flags)'
/opt/local/lib/libmongoclient.a(dbclient.o): In function `boost::re_detail::perl_matcher<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::match_match()':
/usr/include/boost/regex/v4/perl_matcher_non_recursive.hpp:991: undefined reference to `boost::match_results<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >::maybe_assign(boost::match_results<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > const&)'
collect2: error: ld returned 1 exit status
In your g++ command, try to have tutorial.cpp first before the other libs. Some linkers needs to see the objects that need symbols first (from left to right)
Related
I am trying to run the examples in C++ from the WebRTC source code, using the native API(not building)
My Cmakelist is:
cmake_minimum_required(VERSION 3.5)
project(WebRTC)
include_directories("D:/Clion_Projects/src/api")
include_directories("D:/abseil-cpp")
include_directories("D:/CLion_Projects/src/")
add_executable(main examples/peerconnection/server/main.cc)
And the code is:
/*
* Copyright 2011 The WebRTC Project Authors. All rights reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#if defined(WEBRTC_POSIX)
#include <sys/select.h>
#endif
#include <time.h>
#include <string>
#include <vector>
#include "absl/flags/flag.h"
#include "absl/flags/parse.h"
#include "absl/flags/usage.h"
#include "examples/peerconnection/server/data_socket.h"
#include "examples/peerconnection/server/peer_channel.h"
#include "system_wrappers/include/field_trial.h"
#include "test/field_trial.h"
ABSL_FLAG(
std::string,
force_fieldtrials,
"",
"Field trials control experimental features. This flag specifies the field "
"trials in effect. E.g. running with "
"--force_fieldtrials=WebRTC-FooFeature/Enabled/ "
"will assign the group Enabled to field trial WebRTC-FooFeature. Multiple "
"trials are separated by \"/\"");
ABSL_FLAG(int, port, 8888, "default: 8888");
static const size_t kMaxConnections = (FD_SETSIZE - 2);
void HandleBrowserRequest(DataSocket *ds, bool *quit) {
assert(ds && ds->valid());
assert(quit);
const std::string &path = ds->request_path();
*quit = (path.compare("/quit") == 0);
if (*quit) {
ds->Send("200 OK", true, "text/html", "",
"<html><body>Quitting...</body></html>");
} else if (ds->method() == DataSocket::OPTIONS) {
// We'll get this when a browsers do cross-resource-sharing requests.
// The headers to allow cross-origin script support will be set inside
// Send.
ds->Send("200 OK", true, "", "", "");
} else {
// Here we could write some useful output back to the browser depending on
// the path.
printf("Received an invalid request: %s\n", ds->request_path().c_str());
ds->Send("500 Sorry", true, "text/html", "",
"<html><body>Sorry, not yet implemented</body></html>");
}
}
int main(int argc, char *argv[]) {
absl::SetProgramUsageMessage(
"Example usage: ./peerconnection_server --port=8888\n");
absl::ParseCommandLine(argc, argv);
// InitFieldTrialsFromString stores the char*, so the char array must outlive
// the application.
const std::string force_field_trials = absl::GetFlag(FLAGS_force_fieldtrials);
webrtc::field_trial::InitFieldTrialsFromString(force_field_trials.c_str());
int port = absl::GetFlag(FLAGS_port);
// Abort if the user specifies a port that is outside the allowed
// range [1, 65535].
if ((port < 1) || (port > 65535)) {
printf("Error: %i is not a valid port.\n", port);
return -1;
}
ListeningSocket listener;
if (!listener.Create()) {
printf("Failed to create server socket\n");
return -1;
} else if (!listener.Listen(port)) {
printf("Failed to listen on server socket\n");
return -1;
}
printf("Server listening on port %i\n", port);
PeerChannel clients;
typedef std::vector<DataSocket *> SocketArray;
SocketArray sockets;
bool quit = false;
while (!quit) {
fd_set socket_set;
FD_ZERO(&socket_set);
if (listener.valid())
FD_SET(listener.socket(), &socket_set);
for (SocketArray::iterator i = sockets.begin(); i != sockets.end(); ++i)
FD_SET((*i)->socket(), &socket_set);
struct timeval timeout = {10, 0};
if (select(FD_SETSIZE, &socket_set, NULL, NULL, &timeout) == SOCKET_ERROR) {
printf("select failed\n");
break;
}
for (SocketArray::iterator i = sockets.begin(); i != sockets.end(); ++i) {
DataSocket *s = *i;
bool socket_done = true;
if (FD_ISSET(s->socket(), &socket_set)) {
if (s->OnDataAvailable(&socket_done) && s->request_received()) {
ChannelMember *member = clients.Lookup(s);
if (member || PeerChannel::IsPeerConnection(s)) {
if (!member) {
if (s->PathEquals("/sign_in")) {
clients.AddMember(s);
} else {
printf("No member found for: %s\n", s->request_path().c_str());
s->Send("500 Error", true, "text/plain", "",
"Peer most likely gone.");
}
} else if (member->is_wait_request(s)) {
// no need to do anything.
socket_done = false;
} else {
ChannelMember *target = clients.IsTargetedRequest(s);
if (target) {
member->ForwardRequestToPeer(s, target);
} else if (s->PathEquals("/sign_out")) {
s->Send("200 OK", true, "text/plain", "", "");
} else {
printf("Couldn't find target for request: %s\n",
s->request_path().c_str());
s->Send("500 Error", true, "text/plain", "",
"Peer most likely gone.");
}
}
} else {
HandleBrowserRequest(s, &quit);
if (quit) {
printf("Quitting...\n");
FD_CLR(listener.socket(), &socket_set);
listener.Close();
clients.CloseAll();
}
}
}
} else {
socket_done = false;
}
if (socket_done) {
printf("Disconnecting socket\n");
clients.OnClosing(s);
assert(s->valid()); // Close must not have been called yet.
FD_CLR(s->socket(), &socket_set);
delete (*i);
i = sockets.erase(i);
if (i == sockets.end())
break;
}
}
clients.CheckForTimeout();
if (FD_ISSET(listener.socket(), &socket_set)) {
DataSocket *s = listener.Accept();
if (sockets.size() >= kMaxConnections) {
delete s; // sorry, that's all we can take.
printf("Connection limit reached\n");
} else {
sockets.push_back(s);
printf("New connection...\n");
}
}
}
for (SocketArray::iterator i = sockets.begin(); i != sockets.end(); ++i)
delete (*i);
sockets.clear();
return 0;
}
But even after configuring the CmakeList I run into these errors:
Scanning dependencies of target main
[ 50%] Building CXX object CMakeFiles/main.dir/examples/peerconnection/server/main.cc.obj
[100%] Linking CXX executable main.exe
CMakeFiles\main.dir/objects.a(main.cc.obj): In function `HandleBrowserRequest(DataSocket*, bool*)':
D:/CLion_Projects/src/examples/peerconnection/server/main.cc:55: undefined reference to `DataSocket::Send(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const'
D:/CLion_Projects/src/examples/peerconnection/server/main.cc:61: undefined reference to `DataSocket::Send(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const'
D:/CLion_Projects/src/examples/peerconnection/server/main.cc:66: undefined reference to `DataSocket::Send(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const'
CMakeFiles\main.dir/objects.a(main.cc.obj): In function `main':
D:/CLion_Projects/src/examples/peerconnection/server/main.cc:72: undefined reference to `absl::SetProgramUsageMessage(absl::string_view)'
D:/CLion_Projects/src/examples/peerconnection/server/main.cc:74: undefined reference to `absl::ParseCommandLine(int, char**)'
D:/CLion_Projects/src/examples/peerconnection/server/main.cc:79: undefined reference to `webrtc::field_trial::InitFieldTrialsFromString(char const*)'
D:/CLion_Projects/src/examples/peerconnection/server/main.cc:91: undefined reference to `SocketBase::Create()'
D:/CLion_Projects/src/examples/peerconnection/server/main.cc:94: undefined reference to `ListeningSocket::Listen(unsigned short)'
D:/CLion_Projects/src/examples/peerconnection/server/main.cc:115: undefined reference to `__imp_select'
D:/CLion_Projects/src/examples/peerconnection/server/main.cc:123: undefined reference to `__WSAFDIsSet'
D:/CLion_Projects/src/examples/peerconnection/server/main.cc:124: undefined reference to `DataSocket::OnDataAvailable(bool*)'
D:/CLion_Projects/src/examples/peerconnection/server/main.cc:125: undefined reference to `PeerChannel::Lookup(DataSocket*) const'
D:/CLion_Projects/src/examples/peerconnection/server/main.cc:126: undefined reference to `PeerChannel::IsPeerConnection(DataSocket const*)'
D:/CLion_Projects/src/examples/peerconnection/server/main.cc:128: undefined reference to `DataSocket::PathEquals(char const*) const'
D:/CLion_Projects/src/examples/peerconnection/server/main.cc:129: undefined reference to `PeerChannel::AddMember(DataSocket*)'
D:/CLion_Projects/src/examples/peerconnection/server/main.cc:132: undefined reference to `DataSocket::Send(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const'
D:/CLion_Projects/src/examples/peerconnection/server/main.cc:135: undefined reference to `ChannelMember::is_wait_request(DataSocket*) const'
D:/CLion_Projects/src/examples/peerconnection/server/main.cc:139: undefined reference to `PeerChannel::IsTargetedRequest(DataSocket const*) const'
D:/CLion_Projects/src/examples/peerconnection/server/main.cc:141: undefined reference to `ChannelMember::ForwardRequestToPeer(DataSocket*, ChannelMember*)'
D:/CLion_Projects/src/examples/peerconnection/server/main.cc:142: undefined reference to `DataSocket::PathEquals(char const*) const'
D:/CLion_Projects/src/examples/peerconnection/server/main.cc:143: undefined reference to `DataSocket::Send(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const'
D:/CLion_Projects/src/examples/peerconnection/server/main.cc:147: undefined reference to `DataSocket::Send(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const'
D:/CLion_Projects/src/examples/peerconnection/server/main.cc:156: undefined reference to `SocketBase::Close()'
D:/CLion_Projects/src/examples/peerconnection/server/main.cc:157: undefined reference to `PeerChannel::CloseAll()'
D:/CLion_Projects/src/examples/peerconnection/server/main.cc:167: undefined reference to `PeerChannel::OnClosing(DataSocket*)'
D:/CLion_Projects/src/examples/peerconnection/server/main.cc:177: undefined reference to `PeerChannel::CheckForTimeout()'
D:/CLion_Projects/src/examples/peerconnection/server/main.cc:179: undefined reference to `__WSAFDIsSet'
D:/CLion_Projects/src/examples/peerconnection/server/main.cc:180: undefined reference to `ListeningSocket::Accept() const'
CMakeFiles\main.dir/objects.a(main.cc.obj):main.cc:(.data+0x0): undefined reference to `vtable for absl::flags_internal::FlagImpl'
CMakeFiles\main.dir/objects.a(main.cc.obj):D:/CLion_Projects/src/examples/peerconnection/server/main.cc:42: undefined reference to `vtable for absl::flags_internal::FlagImpl'
CMakeFiles\main.dir/objects.a(main.cc.obj): In function `SocketBase::~SocketBase()':
D:/CLion_Projects/src/examples/peerconnection/server/data_socket.h:40: undefined reference to `SocketBase::Close()'
CMakeFiles\main.dir/objects.a(main.cc.obj): In function `PeerChannel::~PeerChannel()':
D:/CLion_Projects/src/examples/peerconnection/server/peer_channel.h:75: undefined reference to `PeerChannel::DeleteAll()'
CMakeFiles\main.dir/objects.a(main.cc.obj): In function `absl::flags_internal::FlagRegistrar<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, true>::FlagRegistrar(absl::flags_internal::Flag<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >&, char const*)':
D:/abseil-cpp/absl/flags/internal/flag.h:726: undefined reference to `absl::flags_internal::RegisterCommandLineFlag(absl::CommandLineFlag&, char const*)'
CMakeFiles\main.dir/objects.a(main.cc.obj): In function `absl::flags_internal::FlagRegistrar<int, true>::FlagRegistrar(absl::flags_internal::Flag<int>&, char const*)':
D:/abseil-cpp/absl/flags/internal/flag.h:726: undefined reference to `absl::flags_internal::RegisterCommandLineFlag(absl::CommandLineFlag&, char const*)'
CMakeFiles\main.dir/objects.a(main.cc.obj): In function `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > absl::UnparseFlag<int>(int const&)':
D:/abseil-cpp/absl/flags/marshalling.h:251: undefined reference to `absl::flags_internal::Unparse[abi:cxx11](int)'
CMakeFiles\main.dir/objects.a(main.cc.obj): In function `bool absl::flags_internal::InvokeParseFlag<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(absl::string_view, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*)':
D:/abseil-cpp/absl/flags/marshalling.h:195: undefined reference to `absl::flags_internal::AbslParseFlag(absl::string_view, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*)'
CMakeFiles\main.dir/objects.a(main.cc.obj): In function `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > absl::flags_internal::Unparse<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
D:/abseil-cpp/absl/flags/marshalling.h:208: undefined reference to `absl::flags_internal::AbslUnparseFlag[abi:cxx11](absl::string_view)'
CMakeFiles\main.dir/objects.a(main.cc.obj): In function `bool absl::flags_internal::InvokeParseFlag<int>(absl::string_view, int*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*)':
D:/abseil-cpp/absl/flags/marshalling.h:195: undefined reference to `absl::flags_internal::AbslParseFlag(absl::string_view, int*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*)'
CMakeFiles\main.dir/objects.a(main.cc.obj): In function `absl::flags_internal::Flag<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::Get() const':
D:/abseil-cpp/absl/flags/internal/flag.h:618: undefined reference to `absl::flags_internal::FlagImpl::AssertValidType(void const*, std::type_info const* (*)()) const'
D:/abseil-cpp/absl/flags/internal/flag.h:622: undefined reference to `absl::flags_internal::FlagImpl::Read(void*) const'
CMakeFiles\main.dir/objects.a(main.cc.obj): In function `absl::flags_internal::Flag<int>::Get() const':
D:/abseil-cpp/absl/flags/internal/flag.h:618: undefined reference to `absl::flags_internal::FlagImpl::AssertValidType(void const*, std::type_info const* (*)()) const'
D:/abseil-cpp/absl/flags/internal/flag.h:622: undefined reference to `absl::flags_internal::FlagImpl::Read(void*) const'
collect2.exe: error: ld returned 1 exit status
mingw32-make.exe[3]: *** [CMakeFiles\main.dir\build.make:106: main.exe] Error 1
mingw32-make.exe[2]: *** [CMakeFiles\Makefile2:95: CMakeFiles/main.dir/all] Error 2
mingw32-make.exe[1]: *** [CMakeFiles\Makefile2:102: CMakeFiles/main.dir/rule] Error 2
mingw32-make.exe: *** [Makefile:137: main] Error 2
I don't understand why I am getting these errors, since I am running the example as is from the repo.
Any help would be greatly appreciated!
I have successfully installed the OpenABE Library - https://github.com/zeutro/openabe
But when I try to compile my own program or run the example - https://github.com/zeutro/openabe/blob/master/examples/test_cp.cpp
g++ test.cpp
I get the Error:
/tmp/ccAcWSoq.o: In function main':
test.cpp:(.text+0x29): undefined reference tooabe::InitializeOpenABE()'
test.cpp:(.text+0x6a): undefined reference to oabe::OpenABECryptoContext::OpenABECryptoContext(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool)'
test.cpp:(.text+0xea): undefined reference tooabe::OpenABECryptoContext::generateParams()'
test.cpp:(.text+0x1bf): undefined reference to oabe::OpenABECryptoContext::keygen(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
test.cpp:(.text+0x27b): undefined reference tooabe::OpenABECryptoContext::encrypt(std::__cxx11::basic_string, std::allocator >, std::__cxx11::basic_string, std::allocator > const&, std::__cxx11::basic_string, std::allocator >&)'
test.cpp:(.text+0x2dd): undefined reference to oabe::OpenABECryptoContext::decrypt(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&)'
test.cpp:(.text+0x385): undefined reference tooabe::ShutdownOpenABE()'
/tmp/ccAcWSoq.o: In function oabe::OpenABECryptoContext::~OpenABECryptoContext()':
test.cpp:(.text._ZN4oabe20OpenABECryptoContextD2Ev[_ZN4oabe20OpenABECryptoContextD5Ev]+0xf): undefined reference tovtable for oabe::OpenABECryptoContext'
collect2: error: ld returned 1 exit status
Here is the code - test.cpp
#include <iostream>
#include <string>
#include <cassert>
#include <openabe/openabe.h>
#include <openabe/zsymcrypto.h>
using namespace std;
using namespace oabe;
using namespace oabe::crypto;
int main(int argc, char **argv){
InitializeOpenABE();
OpenABECryptoContext cpabe("CP-ABE");
string ct, pt1 = "plaintext", pt2;
cpabe.generateParams();
cpabe.keygen("|attr1|attr2","key0");
cpabe.encrypt("attr1 and attr2",pt1,ct);
bool result = cpabe.decrypt("key0",ct,pt2);
assert(result && pt1 == pt2);
cout << "Message: " << pt2 << endl;
ShutdownOpenABE();
return 0;
}
Am I even compiling the file correctly?
Or is there any other issue that I cannot seem to identify?
I have a project that has been compiling and linking for months with no problems. A recent upgrade of ubuntu to 15.10 bumped the boost version from 1.55 to 1.58. Now all of a sudden I am getting undefined reference errors. I get the errors whether or not I use static linking or dynamic linking:
dynamic:
> g++ -L"/home/peter/workspace/icflib/Debug" -pthread -o "icfapp"
> ./src/AdminModule.o ./src/CaptureModule.o ./src/FFTModule.o
> ./src/GPSModule.o ./src/ReportModule.o ./src/icfapp.o -licflib
> -lboost_program_options -lboost_date_time -lboost_filesystem -lboost_system -lfftw3 -lmysqlcppconn -lmysqlclient ./src/FFTModule.o: In function
> `boost::filesystem::path::path<boost::filesystem::directory_entry>(boost::filesystem::directory_entry
> const&,
> boost::enable_if<boost::filesystem::path_traits::is_pathable<boost::decay<boost::filesystem::directory_entry>::type>,
> void>::type*)': /usr/include/boost/filesystem/path.hpp:140: undefined
> reference to
> `boost::filesystem::path_traits::dispatch(boost::filesystem::directory_entry
> const&, std::string&)' ./src/icfapp.o: In function
> `processCommandLine(int, char**)':
> /home/peter/workspace/icfapp/Debug/../src/icfapp.cpp:85: undefined
> reference to
> `boost::program_options::options_description::options_description(std::string
> const&, unsigned int, unsigned int)' ./src/icfapp.o: In function
> `boost::program_options::validation_error::validation_error(boost::program_options::validation_error::kind_t,
> std::string const&, std::string const&, int)':
> /usr/include/boost/program_options/errors.hpp:373: undefined
> reference to
> `boost::program_options::validation_error::get_template(boost::program_options::validation_error::kind_t)'
> /usr/include/boost/program_options/errors.hpp:373: undefined
> reference to
> `boost::program_options::error_with_option_name::error_with_option_name(std::string
> const&, std::string const&, std::string const&, int)' ./src/icfapp.o:
> In function
> `boost::program_options::variables_map::operator[](std::string const&)
> const': /usr/include/boost/program_options/variables_map.hpp:155:
> undefined reference to
> `boost::program_options::abstract_variables_map::operator[](std::string
> const&) const' ./src/icfapp.o: In function
> `boost::program_options::basic_command_line_parser<char>::basic_command_line_parser(int,
> char const* const*)':
> /usr/include/boost/program_options/detail/parsers.hpp:43: undefined
> reference to
> `boost::program_options::detail::cmdline::cmdline(std::vector<std::string,
> std::allocator<std::string> > const&)' ./src/icfapp.o: In function
> `boost::program_options::basic_command_line_parser<char>::extra_parser(boost::function1<std::pair<std::string,
> std::string>, std::string const&>)':
> /usr/include/boost/program_options/detail/parsers.hpp:77: undefined
> reference to
> `boost::program_options::detail::cmdline::set_additional_parser(boost::function1<std::pair<std::string,
> std::string>, std::string const&>)' ./src/icfapp.o: In function
> `std::vector<std::string, std::allocator<std::string> >
> boost::program_options::to_internal<std::string>(std::vector<std::string,
> std::allocator<std::string> > const&)':
> /usr/include/boost/program_options/detail/convert.hpp:79: undefined
> reference to `boost::program_options::to_internal(std::string const&)'
> ./src/icfapp.o:(.rodata._ZTVN5boost15program_options11typed_valueIlcEE[_ZTVN5boost15program_options11typed_valueIlcEE]+0x38):
> undefined reference to
> `boost::program_options::value_semantic_codecvt_helper<char>::parse(boost::any&,
> std::vector<std::string, std::allocator<std::string> > const&, bool)
> const'
> ./src/icfapp.o:(.rodata._ZTVN5boost15program_options11typed_valueIjcEE[_ZTVN5boost15program_options11typed_valueIjcEE]+0x38):
> undefined reference to
> `boost::program_options::value_semantic_codecvt_helper<char>::parse(boost::any&,
> std::vector<std::string, std::allocator<std::string> > const&, bool)
> const'
> ./src/icfapp.o:(.rodata._ZTVN5boost15program_options11typed_valueISscEE[_ZTVN5boost15program_options11typed_valueISscEE]+0x38):
> undefined reference to
> `boost::program_options::value_semantic_codecvt_helper<char>::parse(boost::any&,
> std::vector<std::string, std::allocator<std::string> > const&, bool)
> const'
> ./src/icfapp.o:(.rodata._ZTVN5boost15program_options20invalid_option_valueE[_ZTVN5boost15program_options20invalid_option_valueE]+0x30):
> undefined reference to
> `boost::program_options::error_with_option_name::substitute_placeholders(std::string
> const&) const'
> ./src/icfapp.o:(.rodata._ZTVN5boost15program_options16validation_errorE[_ZTVN5boost15program_options16validation_errorE]+0x30):
> undefined reference to
> `boost::program_options::error_with_option_name::substitute_placeholders(std::string
> const&) const' ./src/icfapp.o: In function
> `boost::program_options::typed_value<long, char>::name() const':
> /usr/include/boost/program_options/detail/value_semantic.hpp:19:
> undefined reference to `boost::program_options::arg' ./src/icfapp.o:
> In function `boost::program_options::typed_value<unsigned int,
> char>::name() const':
> /usr/include/boost/program_options/detail/value_semantic.hpp:19:
> undefined reference to `boost::program_options::arg' ./src/icfapp.o:
> In function `boost::program_options::typed_value<std::string,
> char>::name() const':
> /usr/include/boost/program_options/detail/value_semantic.hpp:19:
> undefined reference to `boost::program_options::arg' ./src/icfapp.o:
> In function `boost::program_options::typed_value<std::string,
> char>::xparse(boost::any&, std::vector<std::string,
> std::allocator<std::string> > const&) const':
> /usr/include/boost/program_options/detail/value_semantic.hpp:167:
> undefined reference to `boost::program_options::validate(boost::any&,
> std::vector<std::string, std::allocator<std::string> > const&,
> std::string*, int)' ./src/icfapp.o: In function `void
> boost::program_options::validate<long, char>(boost::any&,
> std::vector<std::basic_string<char, std::char_traits<char>,
> std::allocator<char> >, std::allocator<std::basic_string<char,
> std::char_traits<char>, std::allocator<char> > > > const&, long*,
> long)':
> /usr/include/boost/program_options/detail/value_semantic.hpp:92:
> undefined reference to
> `boost::program_options::invalid_option_value::invalid_option_value(std::string
> const&)' ./src/icfapp.o: In function `void
> boost::program_options::validate<unsigned int, char>(boost::any&,
> std::vector<std::basic_string<char, std::char_traits<char>,
> std::allocator<char> >, std::allocator<std::basic_string<char,
> std::char_traits<char>, std::allocator<char> > > > const&, unsigned
> int*, long)':
> /usr/include/boost/program_options/detail/value_semantic.hpp:92:
> undefined reference to
> `boost::program_options::invalid_option_value::invalid_option_value(std::string
> const&)'
> ./src/icfapp.o:(.rodata._ZTVN5boost16exception_detail10clone_implINS0_19error_info_injectorINS_15program_options16validation_errorEEEEE[_ZTVN5boost16exception_detail10clone_implINS0_19error_info_injectorINS_15program_options16validation_errorEEEEE]+0x38):
> undefined reference to
> `boost::program_options::error_with_option_name::substitute_placeholders(std::string
> const&) const'
> ./src/icfapp.o:(.rodata._ZTVN5boost16exception_detail19error_info_injectorINS_15program_options16validation_errorEEE[_ZTVN5boost16exception_detail19error_info_injectorINS_15program_options16validation_errorEEE]+0x30):
> undefined reference to
> `boost::program_options::error_with_option_name::substitute_placeholders(std::string
> const&) const'
> ./src/icfapp.o:(.rodata._ZTVN5boost16exception_detail10clone_implINS0_19error_info_injectorINS_15program_options20invalid_option_valueEEEEE[_ZTVN5boost16exception_detail10clone_implINS0_19error_info_injectorINS_15program_options20invalid_option_valueEEEEE]+0x38): undefined reference to
> `boost::program_options::error_with_option_name::substitute_placeholders(std::string
> const&) const'
> ./src/icfapp.o:(.rodata._ZTVN5boost16exception_detail19error_info_injectorINS_15program_options20invalid_option_valueEEE[_ZTVN5boost16exception_detail19error_info_injectorINS_15program_options20invalid_option_valueEEE]+0x30):
> undefined reference to
> `boost::program_options::error_with_option_name::substitute_placeholders(std::string
> const&) const' /home/peter/workspace/icflib/Debug/libicflib.a(DBO.o):
> In function `unsigned short
> boost::date_time::month_str_to_ushort<boost::gregorian::greg_month>(std::string
> const&)': /usr/include/boost/date_time/date_parsing.hpp:67: undefined
> reference to `boost::gregorian::greg_month::get_month_map_ptr()'
> collect2: error: ld returned 1 exit status
static:
g++ -L"/home/peter/workspace/icflib/Release" -pthread -Wl,--no-as-needed -o "icfapp" ./src/AdminModule.o ./src/CaptureModule.o ./src/FFTModule.o ./src/GPSModule.o ./src/ReportModule.o ./src/icfapp.o /home/peter/workspace/icflib/Release/libicflib.a /usr/lib/x86_64-linux-gnu/libboost_program_options.a /usr/lib/x86_64-linux-gnu/libboost_date_time.a /usr/lib/x86_64-linux-gnu/libboost_filesystem.a /usr/lib/x86_64-linux-gnu/libboost_system.a -lfftw3 -lmysqlcppconn -lmysqlclient
./src/FFTModule.o: In function `getLTETxtFiles(dboFlightConfig&)':
FFTModule.cpp:(.text+0x1146): undefined reference to `boost::filesystem::path_traits::dispatch(boost::filesystem::directory_entry const&, std::string&)'
./src/FFTModule.o: In function `FFTModule::scanDir(ICFSocket*)':
FFTModule.cpp:(.text+0xe95c): undefined reference to `boost::filesystem::path_traits::dispatch(boost::filesystem::directory_entry const&, std::string&)'
./src/icfapp.o: In function `processCommandLine(int, char**)':
SNIPPED...
Is there something different in boost 1.58 that I need to set different compile flags?
Make sure you compile everything with the same compiler & flags.
This means you need clean the build(s) and use the same compiler that was used to build the packaged version of boost (note that gcc will also have been updated as part of the dist-upgrade).
Any changes to ABI or (implicit) preprocessor directives can lead the header files to emit different (effective) declarations, and violate the ODR.
What's worse than getting the linker error is that you might actually have gotten Undefined Behaviour silently.
The command:
g++ -o "webserver" ./webserver.o -lwtdbopostgres -lwtdbo -lwthttp -lwt -lboost_signals
The horrendous, horrendous output:
./webserver.o: In function `Wt::Dbo::Impl::QueryBase<Wt::Dbo::ptr<pool::db::Settings> >::statements(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&, int, int) const':
webserver.cpp (.text._ZNK2Wt3Dbo4Impl9QueryBaseINS0_3ptrIN4pool2db8SettingsEEEE10statementsERKSsSA_SA_ii[Wt::Dbo::Impl::QueryBase<Wt::Dbo::ptr<pool::db::Settings> >::statements(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&, int, int) const]+0x1b3): undefined reference to `Wt::Dbo::Impl::completeQuerySelectSql(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&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int, int, std::vector<Wt::Dbo::FieldInfo, std::allocator<Wt::Dbo::FieldInfo> > const&, bool)'
webserver.cpp:(.text._ZNK2Wt3Dbo4Impl9QueryBaseINS0_3ptrIN4pool2db8SettingsEEEE10statementsERKSsSA_SA_ii[Wt::Dbo::Impl::QueryBase<Wt::Dbo::ptr<pool::db::Settings> >::statements(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&, int, int) const]+0x25c): undefined reference to `Wt::Dbo::Impl::createQueryCountSql(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&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int, int, bool)'
Many, many more lines...
Extracting the error messages a bit:
undefined reference to `Wt::Dbo::Impl::completeQuerySelectSql
undefined reference to `Wt::Dbo::Impl::createQueryCountSql
undefined reference to `Wt::Dbo::Impl::createWrappedQueryCountSql
...
Why are these not found? It is being linked with -lwtdbo and -lwtdbopostgres, which is what the project settings came with. This is after I downloaded, compiled, and installed the latest wt versions manually. Previously I had gotten them using apt-get and I had a different set of errors, though still undefined-reference-related.
It's likely that libwtdbopostgres.so and libwtdbo.so aren't in your library path. Check your $LD_LIBRARY_PATH to see if the path those libs are located appears.
Alternatively try using -L to specific the path to your two libraries
ie:
g++ -o "webserver" -L/home/libs ./webserver.o -lwtdbopostgres -lwtdbo... etc..
I have written a class using std::tr1::regex, and I don't know how to link it. I get (sorry for the large dump...) :
$ g++ DictReader.cpp -std=c++0x
/usr/include/c++/4.4/tr1_impl/regex:2255: warning: inline function ‘bool std::tr1::regex_search(_Bi_iter, _Bi_iter, std::tr1::match_results<_Bi_iter, _Allocator>&, const std::tr1::basic_regex<_Ch_type, _Rx_traits>&, std::tr1::regex_constants::match_flag_type) [with _Bi_iter = __gnu_cxx::__normal_iterator<const char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, _Allocator = std::allocator<std::tr1::sub_match<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, _Ch_type = char, _Rx_traits = std::tr1::regex_traits<char>]’ used but never defined
/usr/lib/gcc/x86_64-linux-gnu/4.4.1/../../../../lib/crt1.o: In function `_start':
/build/buildd/eglibc-2.10.1/csu/../sysdeps/x86_64/elf/start.S:109: undefined reference to `main'
/tmp/ccgBkWlK.o: In function `DictReader::operator++(int)':
DictReader.cpp:(.text+0xb2a): undefined reference to `bool std::tr1::regex_search<__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::tr1::sub_match<__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, char, std::tr1::regex_traits<char> >(__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::tr1::match_results<__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::tr1::sub_match<__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >&, std::tr1::basic_regex<char, std::tr1::regex_traits<char> > const&, std::bitset<11ul>)'
/tmp/ccgBkWlK.o: In function `std::tr1::basic_regex<char, std::tr1::regex_traits<char> >::basic_regex(char const*, unsigned int)':
DictReader.cpp:(.text._ZNSt3tr111basic_regexIcNS_12regex_traitsIcEEEC1EPKcj[std::tr1::basic_regex<char, std::tr1::regex_traits<char> >::basic_regex(char const*, unsigned int)]+0x75): undefined reference to `std::tr1::basic_regex<char, std::tr1::regex_traits<char> >::_M_compile()'
/tmp/ccgBkWlK.o: In function `std::tr1::basic_regex<char, std::tr1::regex_traits<char> >::basic_regex(std::tr1::basic_regex<char, std::tr1::regex_traits<char> > const&)':
DictReader.cpp:(.text._ZNSt3tr111basic_regexIcNS_12regex_traitsIcEEEC1ERKS3_[std::tr1::basic_regex<char, std::tr1::regex_traits<char> >::basic_regex(std::tr1::basic_regex<char, std::tr1::regex_traits<char> > const&)]+0x60): undefined reference to `std::tr1::basic_regex<char, std::tr1::regex_traits<char> >::_M_compile()'
collect2: ld returned 1 exit status.
What should I link against?
This is a linker error, it does not found the function you are using. TR1 is still new so it may not be implemented everywhere. I recommend you to use the boost regex library instead.