GCC的c++库问题

C++ Library Troubles with GCC

本文关键字:问题 c++ GCC      更新时间:2023-10-16

我是c++的新手,但我有很多编程的一般经验,所以我熟悉大多数底层的概念。

无论如何,我想我应该试着写一个IRC客户端,因为IRC似乎有一个相对简单的TCP协议。(这很容易,您可以通过Telnet访问和使用服务器,这是不实际的,但可行)

所以我搜索"c++套接字库",遇到了dlib,一个通用的库,包括一些套接字支持。

我查看了文档,找到了一个应该回显它接收到的任何内容的示例,并尝试编译它。但是,我得到了关于函数的"未定义引用"的错误。

我真不知道现在该怎么办。谁能给我一些建议?

我在Code::Blocks v10.05和GCC 4.4.1中构建这个(我会使用4.6.1,但我还没有弄清楚如何让Code::Blocks以这种方式编译)

下面是确切的示例:
// The contents of this file are in the public domain. See LICENSE_FOR_EXAMPLE_PROGRAMS.txt
/*
    This is an example illustrating the use of the sockets and
    server components from the dlib C++ Library.
    This is a simple echo server.  It listens on port 1234 for incoming
    connections and just echos back any data it receives.
*/


#include "dlib/sockets.h"
#include "dlib/server.h"
#include "dlib/ref.h" // for ref()
#include <iostream>
using namespace dlib;
using namespace std;

class serv : public server::kernel_1a_c
{
    void on_connect  (
        connection& con
    )
    {
        char ch;
        while (con.read(&ch,1) > 0)
        {
            // we are just reading one char at a time and writing it back
            // to the connection.  If there is some problem writing the char
            // then we quit the loop.
            if (con.write(&ch,1) != 1)
                break;
        }
    }
};

void thread(serv& our_server)
{
    try
    {
        // Start the server.  start() blocks until the server is shutdown
        // by a call to clear()
        our_server.start();
    }
    catch (socket_error& e)
    {
        cout << "Socket error while starting server: " << e.what() << endl;
    }
    catch (exception& e)
    {
        cout << "Error while starting server: " << e.what() << endl;
    }
}

int main()
{
    try
    {
        serv our_server;
        // set up the server object we have made
        our_server.set_listening_port(1234);
        our_server.set_max_connections(1000);
        // create a thread that will start the server.   The ref() here allows us to pass
        // our_server into the threaded function by reference.
        thread_function t(thread, dlib::ref(our_server));
        cout << "Press enter to end this program" << endl;
        cin.get();
        // this will cause the server to shut down
        our_server.clear();
    }
    catch (exception& e)
    {
        cout << e.what() << endl;
    }
    catch (...)
    {
        cout << "Some error occurred" << endl;
    }
}

然后这里是输出:

-------------- Build: Release in test ---------------
Compiling: main.cpp
Linking console executable: bintest.exe
objmain.o:main.cpp:(.text+0xe): undefined reference to `dlib::logger::~logger()'
objmain.o:main.cpp:(.text+0x1d3): undefined reference to `dlib::logger::logger(char const*)'
objmain.o:main.cpp:(.text+0x3cf): undefined reference to `dlib::threaded_object::threaded_object()'
objmain.o:main.cpp:(.text+0x44a): undefined reference to `dlib::threaded_object::start()'
objmain.o:main.cpp:(.text+0x4ef): undefined reference to `dlib::threaded_object::wait() const'
objmain.o:main.cpp:(.text+0x523): undefined reference to `dlib::threaded_object::~threaded_object()'
objmain.o:main.cpp:(.text+0x5e8): undefined reference to `dlib::threaded_object::~threaded_object()'
objmain.o:main.cpp:(.text+0x701): undefined reference to `dlib::threaded_object::~threaded_object()'
objmain.o:main.cpp:(.text$_ZN4serv10on_connectERN4dlib10connectionE[serv::on_connect(dlib::connection&)]+0x20): undefined reference to `dlib::connection::read(char*, long)'
objmain.o:main.cpp:(.text$_ZN4serv10on_connectERN4dlib10connectionE[serv::on_connect(dlib::connection&)]+0x38): undefined reference to `dlib::connection::write(char const*, long)'
objmain.o:main.cpp:(.text$_ZN4dlib15thread_functionD0Ev[dlib::thread_function::~thread_function()]+0x43): undefined reference to `dlib::threaded_object::wait() const'
objmain.o:main.cpp:(.text$_ZN4dlib15thread_functionD0Ev[dlib::thread_function::~thread_function()]+0x70): undefined reference to `dlib::threaded_object::~threaded_object()'
objmain.o:main.cpp:(.text$_ZN4dlib15thread_functionD0Ev[dlib::thread_function::~thread_function()]+0xbe): undefined reference to `dlib::threaded_object::~threaded_object()'
objmain.o:main.cpp:(.text$_ZN4dlib15thread_functionD1Ev[dlib::thread_function::~thread_function()]+0x43): undefined reference to `dlib::threaded_object::wait() const'
objmain.o:main.cpp:(.text$_ZN4dlib15thread_functionD1Ev[dlib::thread_function::~thread_function()]+0x70): undefined reference to `dlib::threaded_object::~threaded_object()'
objmain.o:main.cpp:(.text$_ZN4dlib15thread_functionD1Ev[dlib::thread_function::~thread_function()]+0xb3): undefined reference to `dlib::threaded_object::~threaded_object()'
objmain.o:main.cpp:(.text$_ZN4dlib15server_kernel_1INS_12set_kernel_1IPNS_10connectionENS_27binary_search_tree_kernel_1IS3_cNS_33memory_manager_stateless_kernel_1IcEESt4lessIS3_EEES6_EEE5clearEv[dlib::server_kernel_1<dlib::set_kernel_1<dlib::connection*, dlib::binary_search_tree_kernel_1<dlib::connection*, char, dlib::memory_manager_stateless_kernel_1<char>, std::less<dlib::connection*> >, dlib::memory_manager_stateless_kernel_1<char> > >::clear()]+0x10e): undefined reference to `dlib::connection::shutdown()'
objmain.o:main.cpp:(.text$_ZN4dlib15server_kernel_1INS_12set_kernel_1IPNS_10connectionENS_27binary_search_tree_kernel_1IS3_cNS_33memory_manager_stateless_kernel_1IcEESt4lessIS3_EEES6_EEE18service_connectionEPv[dlib::server_kernel_1<dlib::set_kernel_1<dlib::connection*, dlib::binary_search_tree_kernel_1<dlib::connection*, char, dlib::memory_manager_stateless_kernel_1<char>, std::less<dlib::connection*> >, dlib::memory_manager_stateless_kernel_1<char> > >::service_connection(void*)]+0x9e): undefined reference to `dlib::close_gracefully(dlib::connection*, unsigned long)'
objmain.o:main.cpp:(.text$_ZN4dlib15server_kernel_1INS_12set_kernel_1IPNS_10connectionENS_27binary_search_tree_kernel_1IS3_cNS_33memory_manager_stateless_kernel_1IcEESt4lessIS3_EEES6_EEE18service_connectionEPv[dlib::server_kernel_1<dlib::set_kernel_1<dlib::connection*, dlib::binary_search_tree_kernel_1<dlib::connection*, char, dlib::memory_manager_stateless_kernel_1<char>, std::less<dlib::connection*> >, dlib::memory_manager_stateless_kernel_1<char> > >::service_connection(void*)]+0x352): undefined reference to `dlib::logger::logger_stream::print_end_of_line()'
objmain.o:main.cpp:(.text$_ZN4dlib15server_kernel_1INS_12set_kernel_1IPNS_10connectionENS_27binary_search_tree_kernel_1IS3_cNS_33memory_manager_stateless_kernel_1IcEESt4lessIS3_EEES6_EEE18service_connectionEPv[dlib::server_kernel_1<dlib::set_kernel_1<dlib::connection*, dlib::binary_search_tree_kernel_1<dlib::connection*, char, dlib::memory_manager_stateless_kernel_1<char>, std::less<dlib::connection*> >, dlib::memory_manager_stateless_kernel_1<char> > >::service_connection(void*)]+0x3c5): undefined reference to `dlib::logger::logger_stream::print_header_and_stuff()'
objmain.o:main.cpp:(.text$_ZN4dlib15server_kernel_1INS_12set_kernel_1IPNS_10connectionENS_27binary_search_tree_kernel_1IS3_cNS_33memory_manager_stateless_kernel_1IcEESt4lessIS3_EEES6_EEE18service_connectionEPv[dlib::server_kernel_1<dlib::set_kernel_1<dlib::connection*, dlib::binary_search_tree_kernel_1<dlib::connection*, char, dlib::memory_manager_stateless_kernel_1<char>, std::less<dlib::connection*> >, dlib::memory_manager_stateless_kernel_1<char> > >::service_connection(void*)]+0x3f3): undefined reference to `dlib::logger::logger_stream::print_end_of_line()'
objmain.o:main.cpp:(.text$_ZN4dlib15server_kernel_1INS_12set_kernel_1IPNS_10connectionENS_27binary_search_tree_kernel_1IS3_cNS_33memory_manager_stateless_kernel_1IcEESt4lessIS3_EEES6_EEE5startEv[dlib::server_kernel_1<dlib::set_kernel_1<dlib::connection*, dlib::binary_search_tree_kernel_1<dlib::connection*, char, dlib::memory_manager_stateless_kernel_1<char>, std::less<dlib::connection*> >, dlib::memory_manager_stateless_kernel_1<char> > >::start()]+0x58): undefined reference to `dlib::create_listener(dlib::listener*&, unsigned short, std::string const&)'
objmain.o:main.cpp:(.text$_ZN4dlib15server_kernel_1INS_12set_kernel_1IPNS_10connectionENS_27binary_search_tree_kernel_1IS3_cNS_33memory_manager_stateless_kernel_1IcEESt4lessIS3_EEES6_EEE5startEv[dlib::server_kernel_1<dlib::set_kernel_1<dlib::connection*, dlib::binary_search_tree_kernel_1<dlib::connection*, char, dlib::memory_manager_stateless_kernel_1<char>, std::less<dlib::connection*> >, dlib::memory_manager_stateless_kernel_1<char> > >::start()]+0x11d): undefined reference to `dlib::listener::accept(dlib::connection*&, unsigned long)'
objmain.o:main.cpp:(.text$_ZN4dlib15server_kernel_1INS_12set_kernel_1IPNS_10connectionENS_27binary_search_tree_kernel_1IS3_cNS_33memory_manager_stateless_kernel_1IcEESt4lessIS3_EEES6_EEE5startEv[dlib::server_kernel_1<dlib::set_kernel_1<dlib::connection*, dlib::binary_search_tree_kernel_1<dlib::connection*, char, dlib::memory_manager_stateless_kernel_1<char>, std::less<dlib::connection*> >, dlib::memory_manager_stateless_kernel_1<char> > >::start()]+0x244): undefined reference to `dlib::threads_kernel_shared::thread_pool()'
objmain.o:main.cpp:(.text$_ZN4dlib15server_kernel_1INS_12set_kernel_1IPNS_10connectionENS_27binary_search_tree_kernel_1IS3_cNS_33memory_manager_stateless_kernel_1IcEESt4lessIS3_EEES6_EEE5startEv[dlib::server_kernel_1<dlib::set_kernel_1<dlib::connection*, dlib::binary_search_tree_kernel_1<dlib::connection*, char, dlib::memory_manager_stateless_kernel_1<char>, std::less<dlib::connection*> >, dlib::memory_manager_stateless_kernel_1<char> > >::start()]+0x25b): undefined reference to `dlib::threads_kernel_shared::threader::create_new_thread(void (*)(void*), void*)'
objmain.o:main.cpp:(.text$_ZN4dlib15server_kernel_1INS_12set_kernel_1IPNS_10connectionENS_27binary_search_tree_kernel_1IS3_cNS_33memory_manager_stateless_kernel_1IcEESt4lessIS3_EEES6_EEE5startEv[dlib::server_kernel_1<dlib::set_kernel_1<dlib::connection*, dlib::binary_search_tree_kernel_1<dlib::connection*, char, dlib::memory_manager_stateless_kernel_1<char>, std::less<dlib::connection*> >, dlib::memory_manager_stateless_kernel_1<char> > >::start()]+0x4a3): undefined reference to `dlib::listener::~listener()'
objmain.o:main.cpp:(.text$_ZN4dlib15server_kernel_1INS_12set_kernel_1IPNS_10connectionENS_27binary_search_tree_kernel_1IS3_cNS_33memory_manager_stateless_kernel_1IcEESt4lessIS3_EEES6_EEE5startEv[dlib::server_kernel_1<dlib::set_kernel_1<dlib::connection*, dlib::binary_search_tree_kernel_1<dlib::connection*, char, dlib::memory_manager_stateless_kernel_1<char>, std::less<dlib::connection*> >, dlib::memory_manager_stateless_kernel_1<char> > >::start()]+0x648): undefined reference to `dlib::connection::~connection()'
objmain.o:main.cpp:(.text$_ZN4dlib15server_kernel_1INS_12set_kernel_1IPNS_10connectionENS_27binary_search_tree_kernel_1IS3_cNS_33memory_manager_stateless_kernel_1IcEESt4lessIS3_EEES6_EEE5startEv[dlib::server_kernel_1<dlib::set_kernel_1<dlib::connection*, dlib::binary_search_tree_kernel_1<dlib::connection*, char, dlib::memory_manager_stateless_kernel_1<char>, std::less<dlib::connection*> >, dlib::memory_manager_stateless_kernel_1<char> > >::start()]+0x949): undefined reference to `dlib::listener::~listener()'
objmain.o:main.cpp:(.text$_ZN4dlib15server_kernel_1INS_12set_kernel_1IPNS_10connectionENS_27binary_search_tree_kernel_1IS3_cNS_33memory_manager_stateless_kernel_1IcEESt4lessIS3_EEES6_EEE5startEv[dlib::server_kernel_1<dlib::set_kernel_1<dlib::connection*, dlib::binary_search_tree_kernel_1<dlib::connection*, char, dlib::memory_manager_stateless_kernel_1<char>, std::less<dlib::connection*> >, dlib::memory_manager_stateless_kernel_1<char> > >::start()]+0x9bd): undefined reference to `dlib::connection::~connection()'
objmain.o:main.cpp:(.text$_ZN4dlib15server_kernel_1INS_12set_kernel_1IPNS_10connectionENS_27binary_search_tree_kernel_1IS3_cNS_33memory_manager_stateless_kernel_1IcEESt4lessIS3_EEES6_EEE5startEv[dlib::server_kernel_1<dlib::set_kernel_1<dlib::connection*, dlib::binary_search_tree_kernel_1<dlib::connection*, char, dlib::memory_manager_stateless_kernel_1<char>, std::less<dlib::connection*> >, dlib::memory_manager_stateless_kernel_1<char> > >::start()]+0xdd0): undefined reference to `dlib::listener::~listener()'
objmain.o:main.cpp:(.text$_ZN4dlib15server_kernel_1INS_12set_kernel_1IPNS_10connectionENS_27binary_search_tree_kernel_1IS3_cNS_33memory_manager_stateless_kernel_1IcEESt4lessIS3_EEES6_EEE5startEv[dlib::server_kernel_1<dlib::set_kernel_1<dlib::connection*, dlib::binary_search_tree_kernel_1<dlib::connection*, char, dlib::memory_manager_stateless_kernel_1<char>, std::less<dlib::connection*> >, dlib::memory_manager_stateless_kernel_1<char> > >::start()]+0xdf4): undefined reference to `dlib::connection::~connection()'
objmain.o:main.cpp:(.text$_ZN4dlib15server_kernel_1INS_12set_kernel_1IPNS_10connectionENS_27binary_search_tree_kernel_1IS3_cNS_33memory_manager_stateless_kernel_1IcEESt4lessIS3_EEES6_EEE5startEv[dlib::server_kernel_1<dlib::set_kernel_1<dlib::connection*, dlib::binary_search_tree_kernel_1<dlib::connection*, char, dlib::memory_manager_stateless_kernel_1<char>, std::less<dlib::connection*> >, dlib::memory_manager_stateless_kernel_1<char> > >::start()]+0xf7c): undefined reference to `dlib::listener::~listener()'
objmain.o:main.cpp:(.text$_ZN4dlib15server_kernel_1INS_12set_kernel_1IPNS_10connectionENS_27binary_search_tree_kernel_1IS3_cNS_33memory_manager_stateless_kernel_1IcEESt4lessIS3_EEES6_EEE5startEv[dlib::server_kernel_1<dlib::set_kernel_1<dlib::connection*, dlib::binary_search_tree_kernel_1<dlib::connection*, char, dlib::memory_manager_stateless_kernel_1<char>, std::less<dlib::connection*> >, dlib::memory_manager_stateless_kernel_1<char> > >::start()]+0xfa0): undefined reference to `dlib::connection::~connection()'
collect2: ld returned 1 exit status
Process terminated with status 1 (0 minutes, 5 seconds)
33 errors, 0 warnings

看起来您错过了告诉gcc与dlib库链接的选项。我不知道Code::Blocks的具体设置是什么,但通常使用gcc时,您需要使用-l选项,像这样:

gcc <other compiler options> -ldlib

更新

好吧,我仔细研究了一下,看起来dlib实际上并没有为你构建一个库。外部库包的常见工作方式是通过提供一个makefile来构建*。A或*。你需要链接的文件。但是dlib不提供这个功能,并且需要您将其特殊的source.cpp添加到构建设置中。同样,我不知道如何在代码块中做到这一点,但在编译和链接套接字示例时,以下内容对我有效:

g++ -o dlib_socket -I ../dlib-17.42/ -lpthread -lX11 dlib_socket.cpp ../dlib-17.42/dlib/all/source.cpp

在上面的示例中,我将dlib提取到父目录(因此是../dlib-17.42/dlib)

你读过dlib的如何编译页面吗?听起来您好像忘记将dlib/all/source.cpp添加到您的项目中。添加它应该会使那些链接器错误消失。此外,由于您正在使用Code::Blocks,您需要告诉它链接到这些windows库:gdi32、comctl32、user32、ws2_32和imm32。

同样值得指出的是,Visual Studio 2010有一个免费版本,你可以用它来编译这些c++程序。如果你在windows上编译,我绝对推荐使用这个编译器而不是Code::Blocks。

在我的系统上(Windows XP在3.5GB RAM的虚拟机中)Code::Blocks使用上述方法编译没有问题。但是,如果它拒绝编译dlib/all/source.cpp,您应该将dlib/all/source.cpp中列出的文件单独添加到您的项目中。包含source.cpp的唯一原因是为了方便,实际上并不需要它。

首先http://beej.us/guide/bgnet/告诉您关于套接字编程需要知道的一切。在理解基本的套接字之前就跳到库中是适得其反的。大多数套接字库都是简单的包装器,为您处理数据结构。

这是我多年前为windows写的一个类。

#pragma once
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
class cMySocket {
public:
    cMySocket(void);
    ~cMySocket(void);
    int startup_server(int type, unsigned __int16 port, const char* ip );
    void shutdown_server();
    operator SOCKET();
    cMySocket & operator=(const SOCKET &s);
    bool           running;
    SOCKET         m_socket;
    sockaddr_in    service;
    sockaddr_in    client_addr;
};
cMySocket::cMySocket(void){
    m_socket = SOCKET_ERROR;
    running = false;
}
cMySocket::~cMySocket(void){
    if( m_socket != SOCKET_ERROR )
        closesocket(m_socket);
}
int cMySocket::startup_server(int type, unsigned __int16 port, const char* ip ){
    unsigned long iMode = 1;
    m_socket = socket(AF_INET, type, 0);
    if (m_socket == INVALID_SOCKET){
        throw "Error at socket()n";
    }
    if( ioctlsocket(m_socket, FIONBIO, &iMode) == SOCKET_ERROR){
        closesocket(m_socket);
        throw "Error at ioctlsocket()n";
    }
    memset( &service, 0, sizeof( service ));
    service.sin_family = AF_INET;
    service.sin_addr.s_addr = inet_addr(ip);
    service.sin_port = htons(port);
    if( bind(m_socket, (SOCKADDR*)&service, sizeof(service)) == SOCKET_ERROR ){
        closesocket(m_socket);
        throw "Error at bind()n";
    }
    iMode = 1;
    if ( ioctlsocket( m_socket, FIONBIO, &iMode ) )
    {
        closesocket(m_socket);
        throw "Error at iostlcosket()n";
    }
    if( type == SOCK_STREAM ){
        if( listen( m_socket, 10) == SOCKET_ERROR ){
            closesocket(m_socket);
            throw "Error at listen()n";
        }
    }
    running = true;
    return 1;
}
void cMySocket::shutdown_server(){
    closesocket( m_socket );
    m_socket = SOCKET_ERROR;
    running = false;
}
cMySocket::operator SOCKET () { 
    return m_socket; 
}
cMySocket & cMySocket::operator=(const SOCKET &s){  
    m_socket = s;
    return *this;
}

你仍然需要使用连接,接受,发送,接收函数,以及错误检查。除非您使用库提供的某种实现协议,否则我建议您自己编写套接字实现。

您最好不要使用C::B。试试NetBeans,因为它会生成make文件。

右键单击项目并转到构建选项。在那里你会发现链接器。从那里添加库。

http://www.learncpp.com/cpp-tutorial/a3-using-libraries-with-codeblocks/